簡體   English   中英

SQLAlchemy:使用指定為文本文本的(子)查詢w / FROM子句中的CTE

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM