我正在使用PyPika (0.37.6版)创建要在BigQuery中使用的查询。我正在构建一个包含两个WITH子句的查询,其中一个子句依赖于另一个子句。由于应用程序的动态特性,我无法控制将这些WITH子句添加到查询中的顺序。
以下是示例工作代码:
a_alias = AliasedQuery("a")
b_alias = AliasedQuery("b")
a_subq = Query.select(Term.wrap_constant("1").as_("z")).select(Term.wrap_constant("2").as_("y"))
b_subq = Query.from_(a_alias).select("z")
q = Query.with_(a_subq, "a").from_(a_alias).select(a_alias.y)
q = q.with_(b_subq, "b").from_(b_alias).select(b_alias.z)
sql = q.get_sql(quote_char=None)这将生成一个工作查询:
WITH a AS (SELECT '1' z,'2' y) ,b AS (SELECT a.z FROM a) SELECT a.y,b.z FROM a,b
但是,如果我首先添加b WITH子句,那么由于a尚未定义,因此结果查询:
WITH b AS (SELECT a.z FROM a), a AS (SELECT '1' z,'2' y) SELECT a.y,b.z FROM a,b
不起作用。因为BigQuery不支持WITH RECURSIVE,所以这对我来说不是一个选择。
有什么方法可以控制WITH子句的顺序吗?我在QueryBuilder中看到了_with列表(变量q的类型),但是因为它是私有变量,所以我不想依赖它,尤其是考虑到新版本的PyPika可能不会以同样的方式运行。
我尝试这样做的一种方法是始终在_with列表的开头插入第一个WITH子句,如下所示:q._with.insert(0, q._with.pop())虽然这种方法可以工作,但我希望使用PyPika支持的方式来完成此操作。
在一个相关的问题中,在PyPika中是否有一种受支持的方法来查看已经添加到选择列表或查询的其他部分中的内容?我注意到了q.selects成员变量,但是selects不是公共文档的一部分。当我使用我们项目的Python版本(3.6)时,使用q.selects实际上并不起作用,尽管它在Python3.7中确实可以工作。我尝试使用的代码是:
if any(field.name == "date" for field in q.selects if isinstance(field, Field))我得到的错误如下:
def __getitem__(self, item: slice) -> "BetweenCriterion":
if not isinstance(item, slice):
> raise TypeError("Field' object is not subscriptable")提前感谢您的帮助。
发布于 2020-07-14 07:13:36
在调用query.with_()之后,我想不出如何控制WITH子句的顺序(除了前面提到的hack )。因此,我重组了我的应用程序来解决这个问题。在构建查询的其余部分之前,我现在调用query.with_()。
这也使得我的相关问题变得毫无意义,因为我不再需要查看我已经添加到查询中的内容。
https://stackoverflow.com/questions/62826169
复制相似问题