如何在 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 查询的打印?
如何在 Pandas 中使用 sqlalchemy 执行具有多个日期参数的 sql 存储过程