1

我有两个 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_iduser_id.

我不知道如何告诉 SQLAlchemy 添加AND uc.user_id='456'到 ON 子句。

当前查询:

contacts = (Contact.query.join(ContactUser)
            .filter(Contact.customer_id == customer.id)
            .filter(ContactUser.contact_id == None)

文档提到了一些关于能够使用“加入的两个参数调用”的内容,但似乎只允许我指定一件事,并且我的 ON 子句中需要两个。

另外,我认为我需要使用outerjoin而不是join

4

1 回答 1

0

With the help of the guys in #sqlalchemy, we came up with:

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))
于 2013-08-15T05:32:49.237 回答