91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Sqlalchemy中relationship的理解

發布時間:2020-07-21 00:51:03 來源:網絡 閱讀:2300 作者:kaman1024 欄目:軟件技術

“指向”

即定義一張表中的數據條目指向另一張表中的條目,建立這種有向的“指向”可以讓表以字段的方式查詢到被指向的條目(們),所以,如果要雙向查詢,就需要雙向指向。

One To Many

在“多”方表中添加“一”方的id作為ForeignKey約束,為查詢方便雙方均需要定義relationship()字段;

class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
children = 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="children")

One To One

與One To Many區別不大,只要“一”方的relationship方法中添加一個"uselist=False"參數即可,uselist是一個標量屬性(a scalar attribute),其含義是“一”方對應另一張表的條目不使用列表。

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") 
# 通常也會把backref用函數表示天機uselist=False參數,用以顯示指出。 
# parent = rlationship("parent", backref=backref("child", uselist=False))


Many To Many

借助中間表完成,利用relationship支持的secondary參數,

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")

注意,secondary可以接受'a callable that returns the ultimate argument,which is evaluated only when mappers are first used."即接受可執行參數,可以讓association_table 在稍晚的時候定義,甚至可以在所有模塊都初始化完成后,直到它可調用為止。

class parent(Base):
    __tablename__ = "left"
    id = Column(Integer, primary_key=True)
    children = relationship("Child", 
                            secondary=lambda: assciation_table,
                            backref="parents")

以上relationship參數的表明均可以用類名字符串代替。

刪除Mang To Many記錄,不必手動刪除secondary的中間表數據,數據庫會根據“cascade rule”級聯規則自動刪除。


如果中間表對象需要被調用

class Association(Base):
    __tablename__ = 'association'
    left_id = Column(Integer, ForeignKey('left.id'), primary_key=True)
    right_id = Column(Integer, ForeignKey('right.id'), primary_key=True)
    extra_data = Column(String(50))
    child = relationship("Child", back_populates="parents")
    parent = relationship("Parent", back_populates="children")
class Parent(Base):
    __tablename__ = 'left'
    id = Column(Integer, primary_key=True)
    children = relationship("Association", back_populates="parent")
class Child(Base):
    __tablename__ = 'right'
    id = Column(Integer, primary_key=True)
    parents = relationship("Association", back_populates="child")
    
# create parent, append a child via association
p = Parent()
a = Association(extra_data="some data")
a.child = Child()
p.children.append(a)
# iterate through child objects via association, including association
# attributes
for assoc in p.children:
    print(assoc.extra_data)
    print(assoc.child)


# 尋找答案的路途上要保持耐心和專心!


需要注意:back_populates參數賦值參數一定不能是relationship第一個參數的字段,那樣相當于被對應關系表中有了重復字段。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

浑源县| 湘潭市| 醴陵市| 徐汇区| 兴安县| 儋州市| 崇义县| 天镇县| 吴堡县| 甘孜县| 景德镇市| 灯塔市| 汶川县| 西华县| 米脂县| 三门峡市| 德令哈市| 蓝山县| 边坝县| 建昌县| 克什克腾旗| 安阳县| 赣州市| 五莲县| 永泰县| 寿光市| 洛阳市| 禹州市| 黎城县| 白朗县| 贵溪市| 花莲县| 乐昌市| 巴东县| 河西区| 甘泉县| 邹城市| 漠河县| 洪湖市| 富宁县| 探索|