可以SELECT *
在 SQLAlchemy 中做吗?
具体来说,SELECT * WHERE foo=1
?
今天没有人感受到 SQLALchemy 对 ORM 的热爱吗?给出的答案正确地描述了 SQLAlchemy 提供的较低级别的接口。只是为了完整起见,这是更可能的(对我而言)现实情况,其中您有一个会话实例和一个用户类,该类是 orm 映射到用户表的。
for user in session.query(User).filter_by(name='jack'):
print user
# ...
这会对所有列进行显式选择。
以下选择适用于核心表达式语言(返回RowProxy 对象):
foo_col = sqlalchemy.sql.column('foo')
s = sqlalchemy.sql.select(['*']).where(foo_col == 1)
如果您不列出任何列,您将获得所有列。
query = users.select()
query = query.where(users.c.name=='jack')
result = conn.execute(query)
for row in result:
print row
应该管用。
您也可以随时使用原始 SQL:
str_sql = sql.text("YOUR STRING SQL")
#if you have some args:
args = {
'myarg1': yourarg1
'myarg2': yourarg2}
#then call the execute method from your connection
results = conn.execute(str_sql,args).fetchall()
其中Bar是映射到您的表的类,session是您的 sa 会话:
bars = session.query(Bar).filter(Bar.foo == 1)
原来你可以这样做:
sa.select('*', ...)
对于未手动定义列的连接,仅返回目标表的列。获取连接的所有列(用户表与组表连接:
sql = User.select(from_obj(Group, User.c.group_id == Group.c.id))
# Add all coumns of Group table to select
sql = sql.column(Group)
session.connection().execute(sql)
如果您使用的是 ORM,则可以使用普通的 ORM 构造构建查询,然后直接执行它以获取原始列值:
query = session.query(User).filter_by(name='jack')
for cols in session.connection().execute(query):
print cols
我遇到了同样的问题,我试图从表中获取所有列作为列表,而不是取回 ORM 对象。这样我就可以将该列表转换为熊猫数据框并显示。
有效的是.c
在子查询或 cte 上使用,如下所示:
U = select(User).cte('U')
stmt = select(*U.c)
rows = session.execute(stmt)
然后你会得到每列的元组列表。
另一种选择是以__table__.columns
相同的方式使用:
stmt = select(*User.__table__.columns)
rows = session.execute(stmt)
如果您想将结果转换为数据框,这里是一个衬里:
pd.DataFrame.from_records(rows, columns=rows.keys())
我遇到了同样的问题,我试图从表中获取所有列作为列表,而不是取回 ORM 对象。这样我就可以将该列表转换为熊猫数据框并显示。
有效的是.c
在子查询或 cte 上使用,如下所示:
U = select(User).cte('U')
stmt = select(*U.c)
rows = session.execute(stmt)
然后你会得到每列的元组列表。
另一种选择是以__table__.columns
相同的方式使用:
stmt = select(*User.__table__.columns)
rows = session.execute(stmt)
如果您想将结果转换为数据框,这里是一个衬里:
pd.DataFrame.from_records(dict(zip(r.keys(), r)) for r in rows)
every_column = User.__table__.columns
records = session.query(*every_column).filter(User.foo==1).all()
当 ORM 类被传递给查询函数时,例如query(User)
,结果将由 ORM 实例组成。在大多数情况下,这是开发人员想要并且最容易处理的 - 上面与此方法相对应的答案的受欢迎程度证明了这一点。
在某些情况下,开发人员可能想要一个可迭代的值序列。在这些情况下,可以将所需列对象的列表传递给query()
. 这个答案显示了如何在不硬编码的情况下传递整个列列表,同时仍然在 ORM 层使用 SQLAlchemy。