---
tags: Sqlachemy, 隨手筆記
---
# 隨手筆記 - Sqlachemy 的三種關聯關係
## 撰文動機
第一次使用 Sqlachemy,Model的建立和其他 ORM 差不多,但是關聯的設定需要重新學習一下,以下進行一對多、多對一以及多對多的筆記。
## 關聯關係
### 一對多、多對一
**例子說明:**
以 User 對 Event 的關係為例,一個 User 可以建立多個 Event,一個 Event 只會對應到一個 User,以 User 角度來看 Event 為一對多關係,以 Event 來看就是多對一。
**關聯建立說明:**
[參考](https://stackoverflow.com/questions/51335298/concepts-of-backref-and-back-populate-in-sqlalchemy)
最推雙向關係二 兩張圖皆可以看到其對應關係,相對嚴謹,但必須記得兩邊都要新增或是刪除。
**Code:**
```python
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
# 單向關係
events = relationship('Event')
# 雙向關係 1.
events = relationship('Event', back_populates='create_uid')
# 雙向關係 2. 會在 Event 自動建立 create_user 屬性
events = relationship('Event', backref='create_user')
class Event(Base):
__tablename__ = 'event'
id = Column(Integer, primary_key=True, autoincrement=True)
# 單向關係
create_uid = Column(Integer, ForeignKey('user.id'), nullable=False)
# 雙向關係 1.
create_user = relationship('User', back_populates='events')
```
### 多對多
**例子說明:**
以 Product 和 Tag 為例,Product 可以有多個 Tag,一個 Tag 也可以屬於多個 Product,即為多對多的關係。
還是可以跟上面一樣使用 backref 做單邊新增雙向關係。
**Code:**
```python
product_tag_table = Table(
"association",
Base.metadata,
Column("product_id", ForeignKey("product.id"), primary_key=True),
Column("tag_id", ForeignKey("tag.id"), primary_key=True),
)
class Product(Base):
__tablename__ = 'product'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String, nullable=False)
tags = relationship('Tag', secondary=product_tag_table,
back_populates='products')
class Tag(Base):
__tablename__ = 'tag'
id = Column(Integer, primary_key=True, autoincrement=True)
products = relationship('Tag', secondary=product_tag_table,
back_populates='tags')
```
## 結語
基本上不會難理解,如果使用上有遇到甚麼問題再持續更新此篇筆記。