PythonとPeeweeでモデル継承とデータベースリレーションシップをマスターする

Pythonでデータベースを扱う際に、PeeweeというORM(Object-Relational Mapping)ライブラリがしばしば用いられます。この記事では、Peeweeを用いたモデル継承とデータベースリレーションシップについて、具体的なコード例とその解説、応用例を含めてご紹介します。

目次

Peeweeとは?

Peeweeは、Pythonで使える軽量なORMライブラリです。SQL文を直接書く代わりに、Pythonのクラスとメソッドでデータベース操作を行うことができます。

Peeweeの特長

Peeweeは以下のような特長があります。

  • 学習曲線が緩やか
  • 豊富なドキュメントとコミュニティサポート
  • 機能豊富で拡張性が高い

モデル継承の基礎

Peeweeでは、モデルを継承して新しいモデルを作成することが可能です。

[h3]基本的なモデル継承の例

from peewee import *

class BaseModel(Model):
    """基本モデル"""
    created_at = DateTimeField(constraints=[SQL('DEFAULT CURRENT_TIMESTAMP')])

class User(BaseModel):
    """ユーザーモデル"""
    username = CharField(unique=True)

コード解説

この例では、`BaseModel`という名前の基本モデルを作成しています。この基本モデルには`created_at`というフィールドを持っており、これが各継承モデルに適用されます。

データベースリレーションシップ

データベースリレーションシップとは、データベース内のテーブル同士がどのように関連しているかを定義するものです。

一対多(OneToMany)リレーションシップ

class Author(BaseModel):
    """著者モデル"""
    name = CharField()

class Book(BaseModel):
    """本モデル"""
    title = CharField()
    author = ForeignKeyField(Author, backref='books')

コード解説

この例では、一対多のリレーションシップを表現しています。一人の著者が複数の本を書く場合、`Author`モデルと`Book`モデルとの間にリレーションシップを定義しています。

応用例

多対多(ManyToMany)リレーションシップ

class Student(BaseModel):
    """学生モデル"""
    name = CharField()

class Course(BaseModel):
    """コースモデル"""
    name = CharField()

class StudentCourse(BaseModel):
    """学生とコースの関連モデル"""
    student = ForeignKeyField(Student, backref='courses')
    course = ForeignKeyField(Course, backref='students')

コード解説

ここでは、多対多のリレーションシップを実装しています。一人の学生が複数のコースを取ることができ、一つのコースに複数の学生がいる場合を想定しています。

リレーションシップのカスケード削除

class Article(BaseModel):
    """記事モデル"""
    title = CharField()

class Comment(BaseModel):
    """コメントモデル"""
    content = TextField()
    article = ForeignKeyField(Article, backref='comments', on_delete='CASCADE')

コード解説

`on_delete=’CASCADE’`オプションを使用すると、リレーションシップの親レコード(ここでは`Article`)が削除された場合、関連する子レコード(`Comment`)も自動的に削除されます。

まとめ

Peeweeを用いることで、モデル継承とデータベースリレーションシップを効率よく実装できます。基本的な一対多リレーションシップから、多対多リレーションシップ、カスケード削除まで、多くのケースに対応可能です。

コメント

コメントする

目次