在 SQLAlchemy 的一對多關系中,使用 ForeignKey()
來表示表的外鍵,relationship()
表示表與表之間關聯的屬性。
完整例子:
from sqlalchemy import create_engine, MetaData
from sqlalchemy import Table, Column, Date, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base # 用于創建基礎類
from sqlalchemy.orm import sessionmaker # 用于創建 session
from sqlalchemy.orm import relationship # 建立表與表之間的關系
# 連接數據庫
engine = create_engine('sqlite:///school.db', echo=False)
# 基礎類
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()
# 用戶類(父類)
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
fullname = Column(String(50))
password = Column(String(12))
def __repr__(self):
return self.name
# 郵箱地址類(子類)
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
email_address = Column(String, nullable=False)
user_id = Column(Integer, ForeignKey('users.id')) # 外鍵
# 定義 Address 的 user 屬性,指明二者間關系
user = relationship("User", back_populates="addresses")
def __repr__(self):
return self.email_address
# 定義 User 的 addresses 屬性,指明二者間關系
User.addresses = relationship(
"Address",
order_by=Address.id,
back_populates="user"
)
# 創建表
Base.metadata.create_all(engine)
新表創建好之后,我們創建一個新 user 并且為他添加上 address:
jack = User(name='jack', fullname='Jack Bean', password='gjffdd')
jack.addresses = [
Address(email_address='jack@google.com'),
Address(email_address='j25@yahoo.com')
]
session.add(jack)
session.commit()
執行完上述代碼后,可以看到除了 users 表添加了 jack 以外,addresses 表也被添加了與 jack 對應的兩條記錄。
我們現在查詢 jack 的 addresses:
jack = session.query(User).\
filter_by(name='jack').one()
print(jack.addresses)
# 執行結果
[jack@google.com, j25@yahoo.com]
反過來從 addresses 查詢 user:
address = session.query(Address).\
filter(Address.email_address=='jack@google.com').one()
print(address.user)
# 執行結果
jack
修改某個郵箱地址的用戶:
address = session.query(Address).\
filter(Address.email_address=='jack@google.com').one()
ed = session.query(User).\
filter(User.name=='ed').one()
address.user = ed
session.commit()
print(address.user)
# 執行結果
ed