[英]SQLAlchemy: FROM entry still present in correlated subquery
我正在尝试使用SQLAlchemy构建以下查询(用作包含包含名为tbl_outer
别名的包含查询的子查询):
SELECT max(tbl.ts) AS max_1
FROM tbl
WHERE tbl.id = tbl_outer.id
在阅读文档时,防止tbl_outer
引用出现在FROM子句中的正确方法是query = query.correlate(tbl_outer)
。 但是,相反,我正在获取此信息,好像根本没有调用correlate()
一样:
SELECT max(tbl.ts) AS max_1
FROM tbl, tbl AS tbl_outer
WHERE tbl.id = tbl_outer.id
最小的复制器如下:
import sqlalchemy as sa
import sqlalchemy.orm as sa_orm
engine = sa.create_engine('sqlite:///memory')
meta = sa.MetaData(bind=engine)
table = sa.Table('tbl', meta, sa.Column('id', sa.Integer), sa.Column('ts', sa.Integer))
session = sa_orm.sessionmaker(bind=engine)()
meta.create_all()
tbl_outer = table.alias('tbl_outer')
subquery = session.query(sa.func.max(table.columns.ts)).filter(table.columns.id == tbl_outer.columns.id)
print "=== BEFORE CORRELATION:"
print str(subquery)
print "=== AFTER CORRELATION:"
print str(subquery.correlate(tbl_outer))
当我阅读相关文件的文档以及在StackOverflow上描述其正确用法的其他答案时 ,我希望这个correlate(tbl_outer)
调用将从生成的SQL的FROM
子句中删除tbl AS tbl_outer
。 但是,实际上并没有这样做。
我已经使用SQLAlchemy 1.0.8收到了以上结果。 我想念什么?
这是SQLAlchemy 0.8中引入的功能而不是错误。
在0.8之前,SQLAlchemy可能会生成不会解析为有效SQL的内容。 0.8之后, 仅在context中执行关联 。
在我的真实代码中,我正在测试代码,这些代码通过脱离上下文为外部查询生成WHERE子句。 从SQLAlchemy 0.8开始,只能保证WHERE子句能在较大的准确上下文中准确呈现为文本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.