SQLAlchemyでモデルの継承とポリモーフィズムを理解する

この記事では、Pythonでデータベースを扱う際に使われるライブラリ、SQLAlchemyにおけるモデルの継承とポリモーフィズムについて解説します。具体的なコード例とその詳細な解説、さらに応用例を2つ以上を含めています。

目次

SQLAlchemyとは

SQLAlchemyは、Pythonでリレーショナルデータベースを扱うためのライブラリです。オブジェクト関係マッピング(ORM)をサポートしており、SQLのクエリをPythonのコードで書くことができます。

モデルの継承とは

モデルの継承とは、すでに定義されたモデル(親モデル)から新しいモデル(子モデル)を生成する手法です。これにより、コードの重複を避けつつ効率的にデータモデルを設計できます。

ベースとなるモデル

通常、一つのベースモデルを作成し、それを継承して子モデルを作成します。例えば:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Person(Base):
    __tablename__ = 'persons'
    id = Column(Integer, primary_key=True)
    name = Column(String)

ポリモーフィズムとは

ポリモーフィズムとは、プログラミングにおいて同一のインターフェースで異なる型のオブジェクトを扱う能力です。SQLAlchemyでは、いくつかの方法でポリモーフィズムを実現できます。

具体的な方法

SQLAlchemyでは主に「単一テーブル継承」と「具象テーブル継承」という2つの方法があります。

単一テーブル継承

class Employee(Person):
    __tablename__ = 'persons'
    id = Column(Integer, primary_key=True)
    type = Column(String)
    salary = Column(Integer)
    __mapper_args__ = {
        'polymorphic_identity':'employee',
        'polymorphic_on':type
    }

具象テーブル継承

class Manager(Person):
    __tablename__ = 'managers'
    id = Column(Integer, primary_key=True)
    department = Column(String)

応用例

ユーザーと管理者のモデル

一つのWebアプリケーションで、一般ユーザーと管理者を別々のモデルで扱いたい場合:

class User(Person):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    email = Column(String)
    __mapper_args__ = {
        'polymorphic_identity':'user',
    }
    
class Admin(User):
    __tablename__ = 'admins'
    id = Column(Integer, primary_key=True)
    role = Column(String)

商品カテゴリーのモデル

異なる種類の商品を一つのテーブルで管理したい場合:

class Product(Base):
    __tablename__ = 'products'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    type = Column(String)
    __mapper_args__ = {
        'polymorphic_identity':'product',
        'polymorphic_on':type
    }
    
class Book(Product):
    __mapper_args__ = {
        'polymorphic_identity':'book',
    }
    author = Column(String)

まとめ

SQLAlchemyでのモデル継承とポリモーフィズムは、データモデリングにおいて非常に強力な概念です。この機能を理解し活用することで、より柔軟かつ効率的なデータベース設計が可能となります。

コメント

コメントする

目次