我正在尝试使用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))
在我阅读the documentation for correlate()和other answers describing its correct use here on StackOverflow时,我希望此correlate(tbl_outer)
调用从生成的SQL的tbl AS tbl_outer
子句中删除FROM
;但是,它在实践中并没有这样做。
我已经使用SQLAlchemy 1.0.8收到了上述结果。我错过了什么?
答案 0 :(得分:0)
这是SQLAlchemy 0.8中引入的一个功能,而不是错误。
在0.8之前,SQLAlchemy可以生成无法解析为有效SQL的内容。 0.8之后,correlation is only performed in context。
在我的真实代码中,我通过将这些子句置于上下文之外来测试为外部查询生成WHERE子句的代码。从SQLAlchemy 0.8开始,WHERE子句只能保证在准确的更大的上下文中准确地呈现给文本。