1

SQLAlchemy を使用して、CTE とユニオンの両方を含むクエリを生成しようとしています。残念ながら、ユニオンを適用するたびに、生成された SQL に定義済みの CTE が含まれません。

UNION なしの WITH を含む SQL は次のとおりです。

(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

同じクエリですが、union への呼び出しがあります。

(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 が含まれていると思いますが、そうではありません。

4

1 に答える 1

1

これはバグだと思います。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 + ")"
于 2012-05-20T17:44:32.820 に答える