簡體   English   中英

如何使用現在的外鍵在SQLAlchemy中進行獨特的聯接?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM