[英]How to correctly use SQL joins/subqueries in Sqlalchemy
Say I have the following SQL code and I want to change it to Sqlalchemy: 说我有以下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
I've tried making a subquery for the SELECT id FROM table3 clause as follows: 我尝试对SELECT id FROM table3子句进行子查询,如下所示:
subq = session.query(table3.id).filter(and_(table3.val1 == 'value', table3.val2 == 'value')).subquery()
And then putting everything together: 然后将所有内容放在一起:
query = session.query(table1).join(table2).filter(table2.id == table1.b_id).\
join(subq).filter(table1.val3 == 'value')
When I ouput query.first().amount, this works for a few examples, but for some queries I'm getting no results when there should be something there, so I must be messing up somewhere. 当我输出query.first()。amount时,这适用于一些示例,但是对于某些查询,当应该有东西时,我没有任何结果,因此我必须在某个地方弄乱。 Any ideas where I'm going wrong?
有什么想法我要去哪里吗? Thanks
谢谢
Query below should produce exactly the SQL
you have. 下面的查询应完全生成您拥有的
SQL
。 It is not much different from your, but removes some unnecessary things. 它与您没有太大不同,但是删除了一些不必要的东西。
So if it does not work, then also your original SQL
might not work. 因此,如果它不起作用,那么您原来的
SQL
也可能不起作用。 Therefore, I assume that your issue is not SQL
but either data or the parameters for that query. 因此,我假设您的问题不是
SQL
而是该查询的数据或参数。 And you can always print out the query itself by engine.echo = True
. 而且,您始终可以通过
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.