简体   繁体   English

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM