【发布时间】:2015-09-29 03:44:40
【问题描述】:
我正在尝试使用 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 的FROM 子句中删除tbl AS tbl_outer;但是,实际上并没有这样做。
我使用 SQLAlchemy 1.0.8 收到了上述结果。我错过了什么?
【问题讨论】:
标签: python sqlalchemy