将SQL查询转换为SQLAlchemy查询
我有两个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 =
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))