When working with databases in Python, understanding relationships between tables is crucial. Two of the most common relationships you’ll encounter are one-to-many and many-to-many. Let’s use a WNBA example to explore what these relationships are, how they work in SQLite, and how to implement them using Python.
A one-to-many relationship means that one record in a table is associated with multiple records in another table. For example, in a database of teams and athletes:
A many-to-many relationship occurs when multiple records in one table are associated with multiple records in another table. For example, in a database of athletes and sponsorship deals:
To implement many-to-many relationships in SQLite, you need a junction table (also known as a bridge or association table) to link the two main tables.
First, let’s create a database to demonstrate these relationships.
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()
Let’s add data to demonstrate the one-to-many relationship between teams and athletes.
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)
Now, let’s add data to demonstrate the many-to-many relationship between athletes and brands using the Deal table.
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)
By defining relationships with foreign keys in SQLite and using Python to manage data, you can create robust databases with clear connections between tables. Understanding one-to-many and many-to-many relationships is essential for structuring data effectively.
This simple example scratches the surface, but you can expand it to handle more complex relationships.
The above is the detailed content of One-to-Many and Many-to-Many Relationships in Python with SQLite. For more information, please follow other related articles on the PHP Chinese website!