[英]Malformed query generated by sqlalchemy when using a union with a CTE
我正在尝试使用SQLAlchemy生成涉及CTE和联合的查询。 不幸的是,每当我应用联合时,生成的SQL都不包含定义的CTE。
这是包含WITH的SQL,不带UNION:
(Pdb) import sqlalchemy as sa
(Pdb) print str(sa.select([sa.select([sa.sql.null().label('a1')]).cte('bb')]))
WITH bb AS
(SELECT NULL AS a1)
SELECT bb.a1
FROM bb
现在,执行相同的查询,但调用工会:
(Pdb) print str(sa.select([sa.select([sa.sql.null().label('a1')]).cte('bb')]).union_all(sa.select([sa.sql.null().label('b1')])))
SELECT bb.a1
FROM bb UNION ALL SELECT NULL AS b1
我希望带有联合调用的查询仍包含WITH,但事实并非如此。
我确实相信这是一个错误。 我应用了以下补丁程序使UNION与CTE一起使用:
--- sqlalchemy.orig/sql/compiler.py 2012-05-20 17:39:41.000000000 +0000
+++ sqlalchemy/sql/compiler.py 2012-05-20 17:39:00.000000000 +0000
@@ -562,6 +562,15 @@
text += (cs._limit is not None or cs._offset is not None) and \
self.limit_clause(cs) or ""
+ if self.ctes and \
+ compound_index==1 and not entry:
+ cte_text = self.get_cte_preamble(self.ctes_recursive) + " "
+ cte_text += ", \n".join(
+ [txt for txt in self.ctes.values()]
+ )
+ cte_text += "\n "
+ text = cte_text + text
+
self.stack.pop(-1)
if asfrom and parens:
return "(" + text + ")"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.