Peeweeでのモデルのリレーションシップ定義の詳細と応用

Peeweeを使用する際のモデルのリレーションシップ定義について詳しく解説します。一対一、一対多、多対多のリレーションシップ、それぞれの実装方法と、具体的な応用例についても触れます。

目次

Peeweeとは

PeeweeはPythonで使用できる軽量なORM(Object-Relational Mapping)ライブラリです。SQLデータベースとのやりとりをPythonオブジェクトを介して行うことができます。

モデルのリレーションシップとは

データベースでデータを扱う際、テーブル間の関連性をどのように扱うかというのがリレーションシップです。一対一、一対多、多対多など、いくつかの種類があります。

一対一(One-to-One)

一対一リレーションシップは、一つのテーブルのレコードが他のテーブルのレコードと一つだけ関連している状態を指します。

from peewee import *

db = SqliteDatabase('example.db')

class User(Model):
    username = CharField()
    class Meta:
        database = db

class Profile(Model):
    user = ForeignKeyField(User, backref='profile')
    bio = CharField()
    class Meta:
        database = db

コード解説

– `User`と`Profile`はそれぞれ異なるテーブルを表現しています。
– `ForeignKeyField`を使って、`Profile`テーブルが`User`テーブルと一対一で関連づけられています。

一対多(One-to-Many)

一対多リレーションシップは、一つのテーブルのレコードが他のテーブルの複数のレコードと関連している状態を指します。

class Book(Model):
    user = ForeignKeyField(User, backref='books')
    title = CharField()
    class Meta:
        database = db

コード解説

– `Book`テーブルは`User`テーブルと一対多の関係にあります。
– `ForeignKeyField`の`backref`で、`User`側から`Book`への逆参照ができるようにしています。

多対多(Many-to-Many)

多対多リレーションシップは、多数のレコードが他のテーブルの多数のレコードと関連している状態を指します。

class BookTag(Model):
    book = ForeignKeyField(Book, backref='book_tags')
    tag = CharField()
    class Meta:
        database = db

コード解説

– `Book`と`Tag`の間には多対多の関係が存在します。
– 中間テーブル`BookTag`を作成して、この多対多の関係を表現しています。

応用例1:ユーザーフィルタリング

Peeweeでのリレーションシップを使って、特定の条件に合致するユーザーをフィルタリングする方法を見てみましょう。

# プロフィールに'Bio'が含まれているユーザーを検索
query = (User
         .select()
         .join(Profile)
         .where(Profile.bio.contains('Bio')))

for user in query:
    print(user.username)

応用例2:書籍のタグ付け

Peeweeのリレーションシップを使って、書籍に複数のタグを付ける方法を見てみましょう。

# タグ'Python'と'Programming'がついている書籍を検索
query = (Book
         .select()
         .join(BookTag)
         .where(BookTag.tag << ['Python', 'Programming']))
for book in query:
    print(book.title)

まとめ

Peeweeでのモデルのリレーションシップ定義は、一対一、一対多、多対多といった複数の方式で可能です。具体的なコード例とともにその使い方を理解することで、より複雑なデータモデルを効率よく扱えるようになります。

コメント

コメントする

目次