English 中文(简体)
如何在SQLAlchemy中执行SELECT *?
原标题:
  • 时间:2009-03-11 21:56:49
  •  标签:

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。





相关问题
热门标签