sqlalchemy 各類關係的寫法

Intro

由於 sqlalchemy 這玩意兒不是特別經常使用,偶然提起的時候想寫個多對多關係還搜索了半天。因而趁機作個筆記。python

注意事項

ForeignKey

db.ForeginKey的參數是<表名>.<鍵名>,而不是<類名>.<字段名>,務必注意這個區別。sql

back_populates 和 backref 在多對多關係中使用的區別

back_populates是更推薦的寫法。code

多對多關係中使用backref並指定了secondary的話,另外一張表關聯的relationship字段會使用相同的secondary對象

back_populates則須要在兩張表的relationship中都寫上相同的secondary中間表。sqlalchemy

可調用的 secondary

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裏寫ForeignKeyparent的主鍵,child裏寫relationshipparent裏一樣寫relationshipback_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")

中間表裏寫上parentchild的主鍵做爲foreignkeyparentchild裏的relationship加入參數secondary,指定爲中間表。class

相關文章
相關標籤/搜索