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