我有两个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_id
和user_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
?
答案 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))