簡體   English   中英

SQLAlchemy關系與多個外鍵聯接

[英]SQLAlchemy Relationship Join with Multiple Foreign Keys

使用SQLAlchemy,我在弄清楚如何映射以下關系時遇到了麻煩:一個用戶可以被其他用戶“跟隨”,從而成為“追隨者”的“領導者”。

class User( Base ):
    __tablename__ = 'users'
    id = Column( Integer, primary_key = True )
    followers = relationship( 'User', primaryjoin = 'and_( User.id == UserFollower.leader_id )', cascade = 'all' )
    leaders = relationship( 'User', primaryjoin = 'and_( User.id == UserFollower.follower_id )', cascade = 'all' )

class UserFollower( Base ):
    __tablename__ = 'users_followers'
    leader_id = Column( Integer, ForeignKey( 'users.id' ), primary_key = True )
    follower_id = Column( Integer, ForeignKey( 'users.id' ), primary_key = True )
    follower = relationship( 'User', uselist = False, foreign_keys = [ follower_id ] )
    leader = relationship( 'User', uselist = False, foreign_keys = [ leader_id ] )

從文檔中,我覺得這樣的聲明將具有

some_user.followers

在“ users.id = users_followers.leader_id”上執行“ users”和“ users_followers”表的聯接,其中“ user.id = some_user.id”。

但是,這會產生一個錯誤(類似於如何在具有多個級別/多個聯接的SQLAlchemy中指定表關系? )。 盡管提出的解決方案使我可以解決此問題,但是它阻止了SQLAlchemy關系的'cascading'屬性的使用,因此在刪除User時,也會刪除相應的UserFollower對象。

總結:如何將關系關聯到具有多個外鍵的表,這些外鍵引用同一個鍵並仍然保留級聯(刪除)?

如果閱讀SQLAlchemy文檔的“ 自引用多對多”部分,您將意識到您具有經典的多對多關系。 如果根據文檔定義此關系,則級聯將正常工作:

users_followers = Table(
    'users_followers', Base.metadata,
    Column('leader_id', ForeignKey('users.id'), primary_key=True),
    Column('follower_id', ForeignKey('users.id'), primary_key=True),
)


class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)

    followers = relationship(
        'User',
        secondary=users_followers,
        primaryjoin=id == users_followers.c.leader_id,
        secondaryjoin=id == users_followers.c.follower_id,
        backref="leaders",
        cascade='all',
    )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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