gpt4 book ai didi

python - SQLAlchemy:使用指定为文字文本的(子)查询 w/FROM 子句中的 CTE

转载 作者:太空狗 更新时间:2023-10-30 01:13:28 24 4
gpt4 key购买 nike

我有一个系统,用户可以在其中以文本配置的形式提供查询和 CTE。一种可能的配置类似于以下内容:

import sqlalchemy as sa
cte = sa.select([sa.sql.text('* from foo')]).cte('foo_cte')
q = sa.select([sa.sql.text('* from (select * from foo_cte)')])

实际上,此查询在呈现时将不包含 CTE 前导码:

>>> print q
SELECT * from (select * from foo_cte)

但是,如果我将所有可能的 CTE 添加到选择列表中:

q = q.select_from(cte)

...然后他们有额外的和额外的 FROM 子句,由 SQLAlchemy 在渲染时添加,使语法无效:

>>> print q
WITH foo_cte AS
(SELECT * from foo)
SELECT * from (select * from foo_cte)
FROM foo_cte

是否可以同时使用这两种方式——打印 CTE 序言而不将其添加到生成的 FROM 子句中?

最佳答案

如果您将 q 定义为

q = sa.select(['*']).select_from(cte)

然后 sqlalchemy 能够计算出要发出的正确 sql:

import sqlalchemy as sa
cte = sa.select([sa.text('* from foo')]).cte('foo_cte')
q = sa.select(['*']).select_from(cte)

print(q)
WITH foo_cte AS
(SELECT * FROM foo)
SELECT *
FROM foo_cte

关于python - SQLAlchemy:使用指定为文字文本的(子)查询 w/FROM 子句中的 CTE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34847869/

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