我正在构建一个严重依赖SQLAlchemy的查询构建器的工具,但它允许用户在模型不足的情况下指定要加入的子查询的文本文本.
但是,当我尝试这样的事情时:
q = session.query().from_statement(sa.text(subquery_text)).subquery(subquery_name)
Run Code Online (Sandbox Code Playgroud)
......发生异常:
File ".../lib/sqlalchemy/orm/query.py", line 473, in subquery
return q.alias(name=name)
AttributeError: 'AnnotatedTextClause' object has no attribute 'alias'
Run Code Online (Sandbox Code Playgroud)
查看.subquery()SQLAlchemy的代码库中的实现提高了我们如何从Query对象到AnnotatedTextClause的清晰度:
def subquery(self, name=None, with_labels=False, reduce_columns=False):
# docstring in the original omitted here for brevity
q = self.enable_eagerloads(False)
if with_labels:
q = q.with_labels()
q = q.statement
if reduce_columns:
q = q.reduce_columns()
return q.alias(name=name)
Run Code Online (Sandbox Code Playgroud)
......但我发现自己对于我正在尝试做的事情是否有可能没有任何启发,如果是这样的话,它将如何实现.
我找到了一个有效的语法:
q = sa.text(subquery_text).columns(Table.col_a, Table.col_b).alias(subquery_name)
Run Code Online (Sandbox Code Playgroud)
q然后可以用作标准子查询