首页 > 解决方案 > SQLAlchemy:有没有办法将原始查询附加到查询对象?

问题描述

我正在尝试在 Google 中使用 BigQuery 创建自定义查询

我可以使用 SQLAlchemy 过滤器功能做几乎所有事情

query = TestModel.query.filter(TestModel.timestamp.__gt__(1010101010))

但我想在 where 子句上添加自定义过滤器,如下所示

AND EXISTS (SELECT * FROM UNNEST(column_name) WHERE column_key LIKE '%tit%')

有没有办法使用上面的字符串附加过滤器?

标签: sqlalchemygoogle-bigqueryflask-sqlalchemypybigquery

解决方案


原始查询

您可以像下面这样清楚地做到这一点:

text_clause = text("EXISTS (SELECT * FROM UNNEST(column_name) WHERE column_key LIKE '%tit%')")
ts = 1010101010
q = (
    session.query(TestModel)
    .filter(TestModel.timestamp > ts)
    .filter(text_clause)
)

但是如果可以的话,避免它会更干净,更易于维护。

下面的ORM 查询 应该让您了解如何实现它:

ts = 1010101010

subq = (
    select(literal("*"))
    .select_from(func.unnest(TestModel.column_name))
    .filter(TestModel.column_key.contains("tit"))
).exists()

q = (
    session.query(TestModel)
    .filter(TestModel.timestamp > ts)
    .filter(subq)
)

推荐阅读