由於 sqlalchemy 這玩意兒不是特別經常使用,偶然提起的時候想寫個多對多關係還搜索了半天。因而趁機作個筆記。python
db.ForeginKey
的參數是<表名>.<鍵名>
,而不是<類名>.<字段名>
,務必注意這個區別。sql
back_populates
是更推薦的寫法。code
多對多關係中使用backref
並指定了secondary
的話,另外一張表關聯的relationship
字段會使用相同的secondary
。對象
back_populates
則須要在兩張表的relationship
中都寫上相同的secondary
中間表。sqlalchemy
secondary
參數能夠是一個可調用對象,作一些 trick 的時候應該有用。姑且記下。ip
class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) child = relationship("Child", back_populates="parent") class Child(Base): __tablename__ = 'child' id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('parent.id')) parent = relationship("Parent", back_populates="child")
parent
包含多個child
的一對多關係。child
裏寫ForeignKey
爲parent
的主鍵,child
裏寫relationship
,parent
裏一樣寫relationship
,back_populates
填充上,完事。ci
class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) child = relationship("Child", uselist=False, back_populates="parent") class Child(Base): __tablename__ = 'child' id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('parent.id')) parent = relationship("Parent", back_populates="child")
一對一關係中parent
須要在relationship
里加入參數uselist
,其餘相同,完事兒。io
多對多關係須要一箇中間表。table
association_table = Table('association', Base.metadata, Column('left_id', Integer, ForeignKey('left.id')), Column('right_id', Integer, ForeignKey('right.id')) ) class Parent(Base): __tablename__ = 'left' id = Column(Integer, primary_key=True) children = relationship( "Child", secondary=association_table, back_populates="parents") class Child(Base): __tablename__ = 'right' id = Column(Integer, primary_key=True) parents = relationship( "Parent", secondary=association_table, back_populates="children")
中間表裏寫上parent
和child
的主鍵做爲foreignkey
,parent
和child
裏的relationship
加入參數secondary
,指定爲中間表。class