ORM SQLAlchemy - 建立一個關系 relationship


relationship函數是sqlalchemy對關系之間提供的一種便利的調用方式, backref參數則對關系提供反向引用的聲明

1 背景

如沒有relationship,我們只能像下面這樣調用關系數據

 
 

如果在User中使用relationship定義addresses屬性的話,

addresses = relationship('Address')
則我們可以直接在User對象中通過addresses屬性獲得指定用戶的所有地址

 

 
           

2 backref屬性

 
           

 

大致原理應該就是sqlalchemy在運行時對Address對象動態的設置了一個指向所屬User對象的屬性,這樣就能在實際開發中使邏輯關系更加清晰,代碼更加簡潔了


2 例子
>>> from sqlalchemy import Column, Integer, String >>> class User(Base): ... __tablename__ = 'users' ... ... id = Column(Integer, primary_key=True) ... name = Column(String) ... fullname = Column(String) ... password = Column(String) ... ... def __repr__(self): ... return "<User(name='%s', fullname='%s', password='%s')>" % ( self.name, self.fullname, self.password)


>>> from sqlalchemy import ForeignKey >>> from sqlalchemy.orm import relationship, backref >>> class Address(Base): ... __tablename__ = 'addresses' ... id = Column(Integer, primary_key=True) ... email_address = Column(String, nullable=False) ... user_id = Column(Integer, ForeignKey('users.id')) ... ... user = relationship("User", backref=backref('addresses', order_by=id)) ... ... def __repr__(self): ... return "<Address(email_address='%s')>" % self.email_address


ForeignKey表示,Addresses.user_id列的值應該等於users.id列中的值,即,users的主鍵
relationship(), 它告訴 ORM ,Address類本身應該使用屬性Address.user鏈接到User類
relationship()的參數中有一個稱為backref()的relationship()的子函數,反向提供詳細的信息, 即在users中添加User對應的Address對象的集合,保存在User.addresses
兩個互補關系, Address.userUser.addresses被稱為一個雙向關系,並且這是SQLAlchemy ORM的一個關鍵特性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM