如何在Sqlalchemy中正确使用SQL连接/子查询
假设我有以下的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时,这在一些例子中是有效的,但在某些查询中,我没有得到结果,明明应该有数据,所以我可能哪里出错了。你们觉得我可能错在哪里呢?谢谢!
1 个回答
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)