【问题标题】:Intersect sqlalchemy query objects相交 sqlalchemy 查询对象
【发布时间】:2023-03-29 18:41:01
【问题描述】:

我有两个 sqlalchemy 查询对象(q1 和 q2)——它们都属于同一个表,我希望能够使这两个查询相交。由于我的数据库是 MySql,所以 q1.intersect(q2) 会抛出 sql 语法错误。有没有办法在 sqlalchemy 中执行相交 MySql 查询?我的研究指向使用子查询、别名和左连接,但所有这些解决方案都是本机 sql 查询。我正在寻找一种 sqlalchemy 语法。

查询:

q1 = Model1().query().filter(Model1.description.ilike(%aws%)) 
q2 = Model1().query().filter(Model1.tags.ilike(%cloud%)) 

我要回q1.intersect(q2)

此外,我在此处指定的查询只是更广泛集合中的一种情况。我有一个函数,它接受一个运算符(和/或)和两个操作数(sql alchemy 查询对象,q1 和 q2),对于不同的函数调用,它们可能是不同的和复杂的。在这种情况下,我不能做一个嵌套过滤器。我只需要使用 q1 和 q2。

【问题讨论】:

  • 您的查询是什么?相交可能不是构建查询的最有效方式。你得到的确切错误是什么?此外,sqlalchemy 支持子查询、别名和左连接。
  • query1 = Model1().query().filter(Model1.description.ilike(%aws%)) query2 = Model1().query().filter(Model1.tags.ilike(% cloud%)) 我想返回 query1.intersect(query2)。但这会生成一个 MySql 不支持的相交查询。

标签: python mysql flask-sqlalchemy


【解决方案1】:

对于这种简单的情况,您可以在同一个查询中使用两个过滤器

results = db.query(Model1).filter(
    Model1.description.ilike('%aws'), 
    Model1.tags.ilike('%cloud%')
)

这将返回与相交相同的结果。

使用两个单独的查询:

stmt = q2.subquery()
results = q1.outerjoin(stmt, Model1.id==stmt.c.id).filter(stmt.c.id != None)

【讨论】:

  • 我所指定的只是更广泛集合中的一种情况。我有一个函数,它接受一个运算符(和/或)和两个操作数(sql alchemy 查询对象,q1 和 q2),对于不同的函数调用,它们可能是不同的和复杂的。在这种情况下,我不能做一个嵌套过滤器。我只需要使用 q1 和 q2。
  • 我遇到的错误与以前处理复杂(嵌套)查询时遇到的错误相同:dbquery = operand1.outerjoin(subq, eval('{}.uuid'.format(model)) == subq.c.uuid).filter(subq.c.uuid != None)File "/home/user/env/local/lib/python2.7/site-packages/sqlalchemy/util/_collections.py", line 211, in __getattr__ raise AttributeError(key)AttributeError: uuid 原因是 subq.c.keys() 没有 ' uuid':type(subq.c) = <class 'sqlalchemy.sql.base.ImmutableColumnCollection'>subq.c.keys() = ['%(139874315762576 anon)s_%(139874315638736 anon)s_<model>_uuid', ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 2014-06-18
  • 2019-03-29
  • 2012-12-18
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多