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