[英]How to make distinct join in SQLAlchemy with now Foreign Key?
我在SQLAlchemy中有兩個模型:
class A(Base):
__tablename__ = 'a'
id = Column(Integer, primary_key=True)
common = Column(Integer)
text = Column(String)
class B(Base):
__tablename__ = 'b'
id = Column(Integer, primary_key=True)
common = Column(Integer)
url = Column(String)
這兩個表之間沒有外鍵,我需要使兩個表具有相同的公共屬性。 我需要生成SQLALchemy查詢,該查詢從表A中選擇表B中沒有對應公共值的所有文本,或者對該行url == None
。 是否有任何簡單的查詢使用SQLAlchemy會話來實現?
q並不十分清楚,可能對此有所變化:
from sqlalchemy import or_
class User(db.Model):
id = Column(String, primary_key=True)
common = Column(Integer)
name = Column(db.String(128), index=True, unique=True)
class Dept(db.Model):
id = Column(String, primary_key=True)
common = Column(Integer)
url = Column(String)
user1 = User(common=1)
user2 = User(common=2)
user3 = User(common=0)
dept1 = Dept( common = 0 )
dept2 = Dept( common = 1 )
dept3 = Dept( common = 3 )
dept3 = Dept( common = 4 )
common = db.session.query(User.common).distinct()
result = db.session.query(Dept).filter(Dept.common.notin_(common))
print([ r.common for r in result.all()] )
### filter dept.url:
result = db.session.query(Dept).filter(or_(Dept.common.notin_(common), Dept.url == 'xx'))
輸出>> [3,4]
如果我已正確理解您的要求,則希望A的URL不包含非NULL的B:
In [72]: session.query(A.text).\
...: filter(~exists().where(and_(B.common == A.common,
...: B.url != None)))
...:
Out[72]: <sqlalchemy.orm.query.Query at 0x7f50131ce2b0>
In [73]: print(_)
SELECT a.text AS a_text
FROM a
WHERE NOT (EXISTS (SELECT *
FROM b
WHERE b.common = a.common AND b.url IS NOT NULL))
使用LEFT JOIN相同:
In [76]: session.query(A.text).\
...: outerjoin(B, and_(B.common == A.common,
...: B.url != None)).\
...: filter(B.id == None)
...:
Out[76]: <sqlalchemy.orm.query.Query at 0x7f5012f8d1d0>
In [77]: print(_)
SELECT a.text AS a_text
FROM a LEFT OUTER JOIN b ON b.common = a.common AND b.url IS NOT NULL
WHERE b.id IS NULL
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.