带子句的PyPika控制令

带子句的PyPika控制令,pypika,Pypika,我使用PyPika版本0.37.6创建用于BigQuery的查询。我正在构建一个包含两个WITH子句的查询,其中一个子句依赖于另一个子句。由于我的应用程序的动态特性,我无法控制那些带有子句的应用程序添加到查询中的顺序 以下是示例工作代码: a_alias = AliasedQuery("a") b_alias = AliasedQuery("b") a_subq = Query.select(Term.wrap_constant(&

我使用PyPika版本0.37.6创建用于BigQuery的查询。我正在构建一个包含两个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)
生成工作查询的:

使用a作为选择'1'z,'2'y,b作为从a中选择a.z选择a.y,从a,b中选择b.z

但是,如果我首先添加b WITH子句,那么由于a尚未定义,因此生成的查询:

使用b作为从a中选择a.z,a作为从a中选择“1”z,“2”y选择a.y,b.z

不起作用。因为BigQuery不支持递归,所以我不选择递归

有没有办法控制WITH子句的顺序?我在QueryBuilder中看到了变量q类型的_withlist,但由于这是一个私有变量,我不想依赖它,尤其是PyPika的新版本可能不会以同样的方式运行

我尝试这样做的一种方法是始终在_withlist的开头插入第一个WITH子句,如下所示: q、 _with.insert0,q._with.pop 虽然这是可行的,但我还是希望使用PyPika支持的方法来实现这一点

在一个相关的问题中,PyPika中是否有一种受支持的方式来查看已经添加到选择列表或查询的其他部分的内容?我注意到q.selects成员变量,但selects不是公共文档的一部分。在使用我们项目的Python版本3.6时,使用q.selects实际上并不适用于我,尽管它在Python 3.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")

提前感谢您的帮助。

在调用query.WITH之后,我想不出如何控制WITH子句的顺序,除了前面提到的hack。因此,我重新构造了我的应用程序来解决这个问题。在建立查询的其余部分之前,我现在调用query.with u


这也使得我的相关问题变得毫无意义,因为我不再需要查看我已经添加到查询中的内容。

调用query.WITH之后,我无法确定如何控制WITH子句的顺序,除了已经注意到的hack。因此,我重新构造了我的应用程序来解决这个问题。在建立查询的其余部分之前,我现在调用query.with u

这也使得我的相关问题变得毫无意义,因为我不再需要查看我已经添加到查询中的内容