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.user
和User.addresses
被稱為一個雙向關系,並且這是SQLAlchemy ORM
的一個關鍵特性