将SQL查询转换为SQLAlchemy查询

将SQL查询转换为SQLAlchemy查询,sqlalchemy,Sqlalchemy,我有两个SQLALchemy模型,它们之间存在多对多关系: class Contact(db.Model): id = db.Column(db.Integer, primary_key=True) customer_id = db.Column(db.Integer) users = db.relationship(ContactUser, cascade='all, delete-orphan') class User(db.Model): id =

我有两个SQLALchemy模型,它们之间存在多对多关系:

class Contact(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    customer_id = db.Column(db.Integer)    
    users = db.relationship(ContactUser, cascade='all, delete-orphan')

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)

class ContactUser(db.Model):
    contact_id = db.Column(db.Integer, db.ForeignKey('contact.id'), 
                           primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), 
                        primary_key=True)
    user = db.relationship(User)
我要转换此SQL:

SELECT 
    c.* 
FROM 
    contact c LEFT JOIN 
        user_contact uc ON c.id = uc.contact_id AND uc.user_id='456'
WHERE 
    c.customer_id = '123' AND 
    uc.contact_id IS NULL
在SQLAlchemy查询中,我可以指定
customer\u id
user\u id

我不知道如何告诉SQLAlchemy将
和uc.user\u id='456'
添加到ON子句中

当前查询:

contacts = (Contact.query.join(ContactUser)
            .filter(Contact.customer_id == customer.id)
            .filter(ContactUser.contact_id == None)
文档中提到了一些关于能够使用“两个参数调用join”的内容,但似乎只允许我指定一件事,我需要在ON子句中指定两件事


此外,我认为我需要使用
外套
而不是
加入

在#sqlalchemy的帮助下,我们想出了:

from sqlalchemy import and_

...

Contact.query.filter(
    Contact.customer_id==customer_id)
    .outerjoin(ContactUser, and_(Contact.id==ContactUser.contact_id,
                                 ContactUser.user_id!=user_id))
    .filter(ContactUser.contact_id == None))