在 Python 中使用資料庫時,理解表之間的關係至關重要。您將遇到的兩種最常見的關係是一對多和多對多。讓我們透過一個 WNBA 範例來探索這些關係是什麼、它們在 SQLite 中如何運作以及如何使用 Python 實現它們。
一對多關係是指一個表中的一筆記錄與另一個表中的多筆記錄相關聯。例如,在球隊和運動員的資料庫中:
當一個表格中的多筆記錄與另一表中的多筆記錄關聯時,就會出現多對多關係。例如,在運動員和贊助交易的資料庫中:
要在 SQLite 中實現多對多關係,需要一個聯結表(也稱為橋接表或關聯表)來連結兩個主表。
首先,讓我們建立一個資料庫來示範這些關係。
import sqlite3
conn = sqlite3.connect("sports.db") cursor = conn.cursor()
cursor.execute(""" CREATE TABLE IF NOT EXISTS Team ( id INTEGER PRIMARY KEY, name TEXT NOT NULL ) """) cursor.execute(""" CREATE TABLE IF NOT EXISTS Athlete ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, team_id INTEGER, FOREIGN KEY (team_id) REFERENCES Team (id) ) """) cursor.execute(""" CREATE TABLE IF NOT EXISTS Brand ( id INTEGER PRIMARY KEY, name TEXT NOT NULL ) """) cursor.execute(""" CREATE TABLE IF NOT EXISTS Deal ( id INTEGER PRIMARY KEY, athlete_id INTEGER, brand_id INTEGER, FOREIGN KEY (athlete_id) REFERENCES Athlete (id), FOREIGN KEY (brand_id) REFERENCES Brand (id) ) """) conn.commit()
讓我們加入數據來展示團隊和運動員之間的一對多關係。
cursor.execute("INSERT INTO Team (name) VALUES (?)", ("New York Liberty",)) team_id = cursor.lastrowid cursor.execute("INSERT INTO Athlete (name, team_id) VALUES (?, ?)", ("Breanna Stewart", team_id)) cursor.execute("INSERT INTO Athlete (name, team_id) VALUES (?, ?)", ("Sabrina Ionescu", team_id)) conn.commit()
cursor.execute("SELECT name FROM Athlete WHERE team_id = ?", (team_id,)) athletes = cursor.fetchall() print("Athletes on the team:", athletes)
現在,讓我們使用 Deal 表添加數據來演示運動員和品牌之間的多對多關係。
cursor.execute("INSERT INTO Brand (name) VALUES (?)", ("Nike",)) brand_id_nike = cursor.lastrowid cursor.execute("INSERT INTO Brand (name) VALUES (?)", ("Adidas",)) brand_id_adidas = cursor.lastrowid
cursor.execute("INSERT INTO Deal (athlete_id, brand_id) VALUES (?, ?)", (1, brand_id_nike)) cursor.execute("INSERT INTO Deal (athlete_id, brand_id) VALUES (?, ?)", (1, brand_id_adidas)) cursor.execute("INSERT INTO Deal (athlete_id, brand_id) VALUES (?, ?)", (2, brand_id_nike)) conn.commit()
cursor.execute(""" SELECT Brand.name FROM Brand JOIN Deal ON Brand.id = Deal.brand_id WHERE Deal.athlete_id = ? """, (1,)) brands = cursor.fetchall() print("Brands for Athlete 1:", brands)
透過在 SQLite 中定義與外鍵的關係並使用 Python 管理數據,您可以建立表格之間具有清晰連接的強大資料庫。理解一對多和多對多關係對於有效建立資料至關重要。
這個簡單的範例只涉及表面,但您可以擴展它以處理更複雜的關係。
以上是Python 與 SQLite 中的一對多和多對多關係的詳細內容。更多資訊請關注PHP中文網其他相關文章!