[英]SQLAlchemy: Using a CTE from a (sub)query w/ FROM clause specified as literal text
我有一個系統,用戶可以將查詢和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)
...然后,他們在渲染時有SQLAlchemy添加的額外且超常的FROM子句,使語法無效:
>>> 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.