Python 如何迭代这个sqlalchemy查询?

Python 如何迭代这个sqlalchemy查询?,python,sqlalchemy,Python,Sqlalchemy,python的新手,sqlalchemy的新手。我有以下资料: 如果没有子查询,当我在没有子查询的情况下连接两个表时,返回的每一行实际上是两个对象: query = DBSession.query(Table1,Table2).outerjoin(Table2,Table1.id==Table2.id) for row in query: # returns (<myproject.models.Table1 object at 0x3ad2e50>,<my

python的新手,sqlalchemy的新手。我有以下资料:

如果没有子查询,当我在没有子查询的情况下连接两个表时,返回的每一行实际上是两个对象:

query = DBSession.query(Table1,Table2).outerjoin(Table2,Table1.id==Table2.id)
   for row in query:
       # returns (<myproject.models.Table1 object at 0x3ad2e50>,<myproject.models.Table2 object at 0x3ad2e50>)
query=DBSession.query(表1,表2).outerjoin(表2,表1.id==Table2.id)
对于查询中的行:
#返回(,)
使用子查询时,行为会发生更改:

subquery = DBSession.query(Table1).order_by(Table1.d.desc()).subquery() 
query = DBSession.query(subquery,Table2).outerjoin(Table2,subquery.c.id==Table2.id).group_by(subquery.c.id) 



for row in query:
    # hoping for 2 objects (<myproject.models.Table1 object at 0x3ad2e50>,<myproject.models.Table2 object at 0x3ad2e50>)
    # receiving (1,'Dave Thomas',10001,<myproject.models.Table1 object at 0x3ad2e50>)
subquery=DBSession.query(表1).order_by(表1.d.desc()).subquery()
query=DBSession.query(subquery,Table2).outerjoin(Table2,subquery.c.id==Table2.id).groupby(subquery.c.id)
对于查询中的行:
#希望有两个对象(,)
#接收(1,'Dave Thomas',10001,)
如何为上面的子查询获取2个对象?表1的列可能有一天会改变,因此我不知道元组中的位置


谢谢

这会奏效吗

subsubquery = DBSession.query(Table1).order_by(Table1.d.desc()).subquery() 
subquery = DBSession.query(subsubquery,Table2).outerjoin(Table2,subsubquery.c.id==Table2.id).group_by(subsubquery.c.id).subquery( with_labels = True )
query = DBSession.query(Table1,Table2).select_from( subquery )

您尝试过为子查询使用别名吗?

您的结果有点混乱。通常,如果子查询位于
SELECT
上下文中(在SQLAlchemy中通过发出
as_scalar
实现),则子查询必须返回标量结果(即一个值)。要立即跟踪您的问题,请打开日志记录(在
create\u engine
上传入
echo=True
甚至
echo=“debug”
)。这将为您提供已执行的SQL语句。然后您可以自己查看(并执行)它们,看看这是否真的是一个SQLAlchemy问题,或者是否需要首先修复查询。查询运行良好。我只希望它每行返回两个对象。请再读一遍,我明白了。请尝试打开日志记录并查看执行的查询。将这些查询与您实际想要执行的查询进行比较,并检查您是否能够修复这些查询。如果您陷入困境(或者用普通SQL编写,或者将其转换为SQLAlchemy查询),请使用详细信息更新您的问题,我将帮助您跟踪问题。