ホームページ > バックエンド開発 > Python チュートリアル > Python と SQLite における 1 対多および多対多の関係

Python と SQLite における 1 対多および多対多の関係

Patricia Arquette
リリース: 2024-12-30 17:08:09
オリジナル
274 人が閲覧しました

Python でデータベースを操作する場合、テーブル間の関係を理解することが重要です。最も一般的な関係は、1 対多と多対多の 2 つです。 WNBA の例を使用して、これらの関係が何であるか、SQLite でどのように機能するか、Python を使用して実装する方法を調べてみましょう。

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

1対多および多対多の関係とは何ですか?

1対多

1 対多の関係とは、テーブル内の 1 つのレコードが別のテーブル内の複数のレコードに関連付けられていることを意味します。たとえば、チームとアスリートのデータベースでは次のようになります。

  • 1 つのチームに多くのアスリートが所属する場合があります。
  • 各アスリートは 1 つのチームのみに所属します。

多対多

多対多の関係は、1 つのテーブル内の複数のレコードが別のテーブル内の複数のレコードに関連付けられている場合に発生します。たとえば、アスリートとスポンサー契約のデータベースでは次のようになります。

  • アスリートは多くのブランドと契約を結ぶことができます。
  • ブランドは多くのアスリートと契約を結ぶことができます。

SQLite で多対多のリレーションシップを実装するには、2 つのメイン テーブルをリンクするジャンクション テーブル (ブリッジまたはアソシエーション テーブルとも呼ばれる) が必要です。

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()

ログイン後にコピー

1 対多: チームとアスリート

データを追加して、チームとアスリート間の 1 対多の関係を示しましょう。

チームと選手を挿入する

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 を使用してデータを管理することにより、テーブル間の明確な接続を持つ堅牢なデータベースを作成できます。データを効果的に構造化するには、1 対多および多対多の関係を理解することが不可欠です。

この単純な例は表面をなぞったものですが、より複雑な関係を処理するために拡張することができます。

以上がPython と SQLite における 1 対多および多対多の関係の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート