SQLAlchemy:FROM条目仍存在于相关子查询中

时间:2015-09-29 03:44:41

标签: python sqlalchemy

我正在尝试使用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收到了上述结果。我错过了什么?

1 个答案:

答案 0 :(得分:0)

这是SQLAlchemy 0.8中引入的一个功能,而不是错误。

在0.8之前,SQLAlchemy可以生成无法解析为有效SQL的内容。 0.8之后,correlation is only performed in context

在我的真实代码中,我通过将这些子句置于上下文之外来测试为外部查询生成WHERE子句的代码。从SQLAlchemy 0.8开始,WHERE子句只能保证在准确的更大的上下文中准确地呈现给文本。