iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
Software Development

從開始到放棄的Flask系列 第 16

[Day 16] Flask SQLAlchemy (4) 多對多關聯

  • 分享至 

  • xImage
  •  

昨天看過了一對多的資料庫關聯,今天我們會來看看多對多的資料庫關聯,多對多關聯是一種資料庫中常見的關聯型態,它描述了兩個實體之間的關係,其中一個實體可以與多個另一實體相關聯,反之亦然。這種關聯型態通常用於模擬現實世界中的多對多關係,其中一個實體可以關聯到多個不同的實體,同時這些不同的實體也可以關聯到多個相同的實體。像是音樂家和音樂樂器:一位音樂家可以演奏多種樂器,同時一種樂器可以被多位音樂家演奏。這種關聯型態用於描述音樂家和他們演奏的樂器之間的關係。

多對多關聯

除了一對多關聯,還有另一個常見的情況為多對多的關聯,例如標籤(Tag)文章(Post)之間的關聯。一篇文章可以有多個標籤,一個標籤也可以關聯到多篇文章。

  • 定義資料模型
    資料模型中會包括一個中間表來處理多對多關聯
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

# 中間表用於處理多對多關聯
musician_instruments = db.Table('musician_instruments',
    db.Column('musician_id', db.Integer, db.ForeignKey('musician.id'), primary_key=True),
    db.Column('instrument_id', db.Integer, db.ForeignKey('instrument.id'), primary_key=True)
)

class Musician(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    instruments = db.relationship('Instrument', secondary=musician_instruments, backref='musicians', lazy='dynamic')

class Instrument(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
  • 中間表在多對多關聯中扮演著關鍵的角色,它的主要作用是管理和維護多對多關聯中的關聯數據。
  • 這個資料模型包含兩個實體:MusicianInstrument,並使用 musician_instruments 作為中間表,以建立它們之間的多對多關聯。每個模型都有一個主鍵 id 和一個名稱屬性,用於描述音樂家的名稱和樂器的名稱。
  • 這樣的設置允許音樂家與多種樂器關聯,同時一種樂器也可以與多位音樂家關聯,實現了多對多的關聯型態。可以使用這個模型來創建、查詢和操作音樂家和樂器之間的關聯數據。

創建

# 創建音樂家
musician1 = Musician(name='John')
musician2 = Musician(name='Alice')

# 創建樂器
instrument1 = Instrument(name='Guitar')
instrument2 = Instrument(name='Piano')

# 建立音樂家和樂器之間的關聯
musician1.instruments.append(instrument1)
musician2.instruments.append(instrument1)
musician2.instruments.append(instrument2)

# 提交到資料庫
db.session.add_all([musician1, musician2, instrument1, instrument2])
db.session.commit()

查詢

# 查詢 John 彈奏的樂器
john = Musician.query.filter_by(name='John').first()
john_instruments = john.instruments.all()
print([instrument.name for instrument in john_instruments])
# 輸出:['Guitar']

總結

多對多關聯模型允許我們在模型之間建立複雜的關聯,例如上面,可以讓一位音樂家可以演奏多種樂器,同時一種樂器也可以被多位音樂家演奏。通過使用中間表來處理這種關聯,我們可以輕鬆地創建、查詢和操作這些關聯數據,使我們的應用程式更具靈活性和功能性。


上一篇
[Day 15] Flask SQLAlchemy (3) 一對多關聯
下一篇
[Day 17]Flask Login(1)
系列文
從開始到放棄的Flask30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言