首页 > 后端开发 > Python教程 > Python 与 SQLite 中的一对多和多对多关系

Python 与 SQLite 中的一对多和多对多关系

Patricia Arquette
发布: 2024-12-30 17:08:09
原创
274 人浏览过

在 Python 中使用数据库时,理解表之间的关系至关重要。您将遇到的两种最常见的关系是一对多和多对多。让我们通过一个 WNBA 示例来探索这些关系是什么、它们在 SQLite 中如何工作以及如何使用 Python 实现它们。

One-to-Many and Many-to-Many Relationships in Python with SQLite

什么是一对多和多对多关系?

一对多

一对多关系是指一个表中的一条记录与另一个表中的多条记录相关联。例如,在球队和运动员的数据库中:

  • 一支球队可以有多名运动员。
  • 每位运动员只属于一个团队。

多对多

当一个表中的多条记录与另一表中的多条记录关联时,就会出现多对多关系。例如,在运动员和赞助交易的数据库中:

  • 一名运动员可以与多个品牌达成交易。
  • 一个品牌可以与许多运动员达成交易。

要在 SQLite 中实现多对多关系,需要一个联结表(也称为桥接表或关联表)来链接两个主表。

使用 SQLite 在 Python 中实现关系

设置数据库

首先,让我们创建一个数据库来演示这些关系。

import sqlite3

登录后复制

连接到 SQLite 数据库(如果不存在则创建一个)

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

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板