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

1 投票
1 回答
1286 浏览
提问于 2025-04-29 01:45

假设我有以下的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)

撰写回答