43

可以SELECT *在 SQLAlchemy 中做吗?

具体来说,SELECT * WHERE foo=1?

4

11 回答 11

47

今天没有人感受到 SQLALchemy 对 ORM 的热爱吗?给出的答案正确地描述了 SQLAlchemy 提供的较低级别的接口。只是为了完整起见,这是更可能的(对我而言)现实情况,其中您有一个会话实例和一个用户类,该类是 orm 映射到用户表的。

for user in session.query(User).filter_by(name='jack'):
     print user
     # ...

这会对所有列进行显式选择。

于 2009-03-11T22:27:31.703 回答
33

以下选择适用于核心表达式语言(返回RowProxy 对象):

foo_col = sqlalchemy.sql.column('foo')
s = sqlalchemy.sql.select(['*']).where(foo_col == 1)
于 2014-04-22T19:48:44.950 回答
11

如果您不列出任何列,您将获得所有列。

query = users.select()
query = query.where(users.c.name=='jack')
result = conn.execute(query)
for row in result:
    print row

应该管用。

于 2009-03-11T22:05:48.697 回答
10

您也可以随时使用原始 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()
于 2013-04-17T15:56:37.200 回答
9

其中Bar是映射到您的表的类,session是您的 sa 会话:

bars = session.query(Bar).filter(Bar.foo == 1)
于 2009-03-11T23:02:32.163 回答
7

原来你可以这样做:

sa.select('*', ...)
于 2009-03-11T22:13:53.733 回答
4

对于未手动定义列的连接,仅返回目标表的列。获取连接的所有列(用户表与组表连接:

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)
于 2013-10-22T10:05:49.480 回答
3

如果您使用的是 ORM,则可以使用普通的 ORM 构造构建查询,然后直接执行它以获取原始列值:

query = session.query(User).filter_by(name='jack')
for cols in session.connection().execute(query):
    print cols
于 2012-09-28T01:50:06.950 回答
3

我遇到了同样的问题,我试图从表中获取所有列作为列表,而不是取回 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())
于 2021-08-27T08:53:31.753 回答
1

我遇到了同样的问题,我试图从表中获取所有列作为列表,而不是取回 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)
于 2021-08-27T08:49:09.867 回答
0
every_column = User.__table__.columns
records = session.query(*every_column).filter(User.foo==1).all()

当 ORM 类被传递给查询函数时,例如query(User),结果将由 ORM 实例组成。在大多数情况下,这是开发人员想要并且最容易处理的 - 上面与此方法相对应的答案的受欢迎程度证明了这一点。

在某些情况下,开发人员可能想要一个可迭代的值序列。在这些情况下,可以将所需列对象的列表传递给query(). 这个答案显示了如何在不硬编码的情况下传递整个列列表,同时仍然在 ORM 层使用 SQLAlchemy。

于 2021-12-14T16:55:30.240 回答