如何在 Sqlalchemy 中正确使用 SQL 连接/子查询

Posted

技术标签:

【中文标题】如何在 Sqlalchemy 中正确使用 SQL 连接/子查询【英文标题】:How to correctly use SQL joins/subqueries in Sqlalchemy 【发布时间】:2014-10-22 15:12:58 【问题描述】:

假设我有以下 SQL 代码,我想将其更改为 Sqlalchemy:

SELECT amount FROM table1
JOIN table2 
  ON table2.id = table1.b_id
JOIN (SELECT id FROM table3 WHERE val1 = %s AND val2 = %s) inst
  ON inst.id = table1.i_id
WHERE
  val3 = %s

我尝试为 SELECT id FROM table3 子句创建子查询,如下所示:

subq = session.query(table3.id).filter(and_(table3.val1 == 'value', table3.val2 == 'value')).subquery()

然后把所有东西放在一起:

query = session.query(table1).join(table2).filter(table2.id == table1.b_id).\
join(subq).filter(table1.val3 == 'value')

当我输出 query.first().amount 时,这适用于一些示例,但对于某些查询,当那里应该有什么东西时我没有得到任何结果,所以我一定是在某个地方搞砸了。有什么想法我哪里出错了吗?谢谢

【问题讨论】:

返回的SQL语句是什么样的?你能给出它什么时候起作用和不起作用的例子吗? 【参考方案1】:

下面的查询应该准确地产生您所拥有的SQL。和你的差别不大,但是去掉了一些不必要的东西。 因此,如果它不起作用,那么您原来的 SQL 也可能不起作用。因此,我假设您的问题不是SQL,而是该查询的数据或参数。您可以随时通过engine.echo = True 打印出查询本身。

val1, val2, val3 = 'value', 'value', 'value'  # @NOTE: specify filter values
subq = (session.query(table3.id)
        .filter(and_(table3.val1 == val1, table3.val2 == val2))
        ).subquery(name='inst')

quer = (
    session.query(table1.amount)  # @NOTE: select only one column
    .join(table2)  # @NOTE: no need for filter(...)
    .join(subq)
    .filter(table1.val3 == val3)
).first()

print(quer and quer.amount)

【讨论】:

以上是关于如何在 Sqlalchemy 中正确使用 SQL 连接/子查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQLAlchemy 中漂亮地格式化 SQL 查询的打印?

如何在 SQLAlchemy 中正确添加数据?

如何在 Pandas 中使用 sqlalchemy 执行具有多个日期参数的 sql 存储过程

如何使用 SQLAlchemy 创建 SQL 视图?

我不知道如何使用 sqlalchemy.create_engine 在 python 中编写 sql 查询

如何在 python 中使用 sqlalchemy 在查询中创建 sql server 表变量