gpt4 book ai didi

python - SQLAlchemy:相关子查询中仍然存在 FROM 条目

转载 作者:行者123 更新时间:2023-12-05 07:53:16 29 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于python - SQLAlchemy:相关子查询中仍然存在 FROM 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32835335/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com