SQLAlchemy 可以执行 SELECT *
吗?
具体而言,SELECT * WHERE foo=1
?
SQLAlchemy 可以执行 SELECT *
吗?
具体而言,SELECT * WHERE foo=1
?
今天没有人感受SQLAlchemy的ORM之爱吗?所提出的答案正确地描述了SQLAlchemy提供的较低级别接口。仅为完整起见,这是更可能的(对我来说)真实世界情况,其中您有一个会话实例和一个被ORM映射到users
表的用户类。
for user in session.query(User).filter_by(name= jack ):
print(user)
# ...
这将对所有列进行显式的select
操作。
以下选择对我在核心表达式语言中有效(返回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( * , ...)
我有同样的问题,我试图从表中获取所有列作为列表,而不是返回ORM对象。这样,我就可以将这个列表转换为pandas数据帧并显示。
使用以下方式在子查询或CTE上使用.c
是有效的:
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())
如果连接没有手动定义列,则只返回目标表的列。要获取所有连接列(用户表与组表连接):
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对象。这样我就可以将该列表转换为pandas数据框并进行显示。
使用以下方式,在子查询或CTE上使用.c
是有效的:
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)
如果您正在使用ORM,您可以使用通常的ORM构造来构建查询,然后直接执行它以获取原始列值。
query = session.query(User).filter_by(name= jack )
for cols in session.connection().execute(query):
print cols
every_column = User.__table__.columns
records = session.query(*every_column).filter(User.foo==1).all()
当ORM类被传递到查询函数中,例如query(User)
,结果将由ORM实例组成。在大多数情况下,这正是开发人员想要的,也是最容易处理的方式 - 正如上面的答案所示,这是该方法最受欢迎的原因。
在某些情况下,开发人员可能希望使用一个可迭代的值序列。在这种情况下,可以将所需列对象的列表传递给query()
方法。本答案展示了如何在不硬编码列的情况下传递整个列列表,同时仍然在ORM层中使用SQLAlchemy。