SQLAlchemy:一个;全包;在_

SQLAlchemy:一个;全包;在_,sqlalchemy,Sqlalchemy,在通常的Customer->Orders示例模式中,如果我们希望获得所有下订单且Order\u category\u id设置为12或13的客户,我们将告诉SQLAlchemy for customer in db.query(Customer)\ .join(Order, Customer.id = Order.cst_id)\ .filter(Order.order_category_id.in_([12,13]): # do something wi

在通常的Customer->Orders示例模式中,如果我们希望获得所有下订单且Order\u category\u id设置为12或13的客户,我们将告诉SQLAlchemy

for customer in db.query(Customer)\
        .join(Order, Customer.id = Order.cst_id)\
        .filter(Order.order_category_id.in_([12,13]):
    # do something with customer
    ...
但是,如果我们想获得所有的
客户
s,他们已经用12个和13个
Order\u category\u id
s下了
订单
s怎么办?在SQL中,我将其编写为:

select * 
from Customer
where 
   exists (select 1 from Order 
    where Customer.id = Order.cst_id and Order.order_category_id = 12)
   and exists (select 1 from Order 
    where Customer.id = Order.cst_id and Order.order_category_id = 13)
如何触发SQLAlchemy来生成这种查询?i、 e.一个返回的客户实体与12和13个类别ID的订单行关联?

类似于以下内容:

subq1 = (
    Customer.query
    .join(Order, Customer.id = Order.cst_id)
    .filter(Order.order_category_id == 12)
).subquery()

final_query = (
    query(subq1)
    .join(Order, Customer.id = Order.cst_id)
    .filter(Order.order_category_id == 13)
)

我还没有测试过这个,但我认为它应该可以工作。

如果您想尝试,您还应该能够使用
db.exists
db.[任何sql函数]
。谢谢!在我的代码中,我最终创建了一个
query(Order).filter(…).filter(Customer.id==Order.cst_id).exists()列表,并将其作为重复的filter(…)调用传递给主查询。