在 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中文网其他相关文章!