SQLAlchemy —— 一對多關系

在 SQLAlchemy 的一對多關系中,使用 ForeignKey() 來表示表的外鍵,relationship() 表示表與表之間關聯(lián)的屬性。

完整例子:

from sqlalchemy import create_engine, MetaData
from sqlalchemy import Table, Column, Date, Integer, String, ForeignKey

from sqlalchemy.ext.declarative import declarative_base # 用于創(chuàng)建基礎類
from sqlalchemy.orm import sessionmaker # 用于創(chuàng)建 session
from sqlalchemy.orm import relationship # 建立表與表之間的關系


# 連接數(shù)據(jù)庫
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"
    )

# 創(chuàng)建表
Base.metadata.create_all(engine)

新表創(chuàng)建好之后,我們創(chuàng)建一個新 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()

執(zhí)行完上述代碼后,可以看到除了 users 表添加了 jack 以外,addresses 表也被添加了與 jack 對應的兩條記錄。

我們現(xiàn)在查詢 jack 的 addresses:

jack = session.query(User).\
    filter_by(name='jack').one()

print(jack.addresses)

# 執(zhí)行結(jié)果
[jack@google.com, j25@yahoo.com]

反過來從 addresses 查詢 user:

address = session.query(Address).\
    filter(Address.email_address=='jack@google.com').one()

print(address.user)

# 執(zhí)行結(jié)果
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)

# 執(zhí)行結(jié)果
ed
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容