将SQL查询转换为SQLAlchemy查询

时间:2013-08-15 04:53:20

标签: 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 = 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

1 个答案:

答案 0 :(得分:0)

在#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))