【问题标题】:SQLAlchemy: FROM entry still present in correlated subquerySQLAlchemy:相关子查询中仍然存在 FROM 条目
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多