Django でデータベースマイグレーションを作成する方法: ガイドとチュートリアル


前提条件

  • manage.pyコマンドを実行できる
  • Django プロジェクトがセットアップされている

手順

  1. モデルを変更する

    データベースに格納するデータを定義するモデルを変更します。モデルは、models.py ファイルで Python クラスとして定義されます。モデルを変更したら、その変更を保存します。

  2. マイグレーションを作成する

    以下のコマンドを実行して、モデルの変更を反映したマイグレーションファイルを生成します。

    python manage.py makemigrations
    

    このコマンドを実行すると、Django はモデルの変更を検出し、対応するマイグレーションファイルを作成します。マイグレーションファイルは、プロジェクトの migrations ディレクトリに保存されます。

  3. マイグレーションを適用する

    以下のコマンドを実行して、生成されたマイグレーションファイルをデータベースに適用します。

    python manage.py migrate
    

    このコマンドを実行すると、Django はマイグレーションファイルに記載されている変更をデータベースに適用します。

以下は、モデルを変更してマイグレーションを作成し、適用する簡単な例です。

models.py

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=255)
    email = models.EmailField()

このモデルは、著者に関する情報を格納するテーブルを定義します。

マイグレーションを作成する

python manage.py makemigrations

このコマンドを実行すると、以下のマイグレーションファイルが生成されます。

# Generated by Django 4.1.1 on 2024-06-19 08:45:00

m0001_initial = operations.Migration(
    operations=[
        operations.CreateModel(
            name='Author',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=255)),
                ('email', models.EmailField()),
            ],
        ),
    ],
)

このマイグレーションファイルは、Author テーブルを作成する操作を定義しています。

マイグレーションを適用する

python manage.py migrate

このコマンドを実行すると、Author テーブルがデータベースに作成されます。

説明

Django のマイグレーションは、データベーススキーマの変更を管理するためのツールです。マイグレーションを使用すると、データベーススキーマを安全かつ簡単に変更できます。

マイグレーションは、以下の利点があります。

  • チームでの作業を容易にする: マイグレーションを使用すると、複数の開発者がデータベーススキーマを安全かつ効率的に変更することができます。
  • データベースの安全な変更: マイグレーションは、データベースへの変更を原子的に実行します。つまり、マイグレーションの一部が失敗しても、データベースが破損する可能性は低くなります。
  • データベーススキーマの変更を追跡する: マイグレーションファイルは、データベーススキーマの変更を時系列で追跡します。これにより、データベースの以前のバージョンに戻したり、将来の変更を容易にマージしたりすることができます。


models.py

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=255)
    email = models.EmailField()

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    publication_date = models.DateField()

このモデルは、著者と書籍に関する情報を格納する 2 つのテーブルを定義します。

マイグレーションを作成する

python manage.py makemigrations
# Generated by Django 4.1.1 on 2024-06-19 08:57:00

m0002_create_book_table = operations.Migration(
    operations=[
        operations.CreateModel(
            name='Book',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=255)),
                ('author', models.ForeignKey(on_delete=models.CASCADE, to='myapp.Author')),
                ('publication_date', models.DateField()),
            ],
        ),
    ],
)

このマイグレーションファイルは、Book テーブルを作成し、Author テーブルとの外部キー制約を定義する操作を定義しています。

マイグレーションを適用する

python manage.py migrate

このコマンドを実行すると、Book テーブルがデータベースに作成され、Author テーブルとの外部キー制約が確立されます。

以下の例では、マイグレーションを使用してデータベーススキーマを様々な方法で変更する方法を示します。

  • 外部キーを削除する: 2 つのモデル間の外部キー制約を削除します。
  • 外部キーを追加する: 2 つのモデル間の外部キー制約を追加します。
  • モデルを削除する: 既存のモデルを削除します。
  • フィールドを変更する: 既存のモデルのフィールドの型や制約を変更します。
  • フィールドを削除する: 既存のモデルからフィールドを削除します。
  • フィールドを追加する: 新しいフィールドを既存のモデルに追加します。


手動で SQL を記述する

最も基本的な代替方法は、データベーススキーマの変更を反映する SQL クエリを直接記述することです。

利点:

  • データベースに直接アクセスするため、パフォーマンスが向上する場合があります。
  • シンプルで、複雑なマイグレーションをより細かく制御できます。

欠点:

  • チームでの作業や将来の変更の追跡が困難になります。
  • Django のマイグレーション履歴と互換性がありません。
  • エラーが発生しやすい。

South を使用する

South は、Django のマイグレーションフレームワークの代替となるサードパーティ製ツールです。

  • テスト駆動開発に適しています。
  • 複雑なマイグレーションをより簡単に記述できます。
  • Django のマイグレーションよりも柔軟で強力な機能を提供します。
  • Django との互換性の問題が発生する可能性があります。
  • Django の標準ツールではないため、習得と使用に時間がかかる場合があります。

Alembic を使用する

Alembic は、SQLAlchemy を使用する Python アプリケーション用のデータベースマイグレーションツールです。

  • 高度な機能を備えています。
  • 宣言型でバージョン管理されたマイグレーションを提供します。
  • Django 以外にも様々なフレームワークで使用できます。
  • Django との密接な統合はありません。
  • Django の標準ツールではないため、習得と使用に時間がかかる場合があります。

データベーススキーマバージョン管理ツールを使用する

Liquibase や Flyway などのデータベーススキーマバージョン管理ツールを使用して、データベーススキーマの変更を管理することもできます。

  • さまざまなデータベースプラットフォームをサポートしています。
  • チームでの作業に適しています。
  • データベーススキーマの変更をバージョン管理および追跡する集中化された方法を提供します。
  • Django のマイグレーションフレームワークと同じレベルの機能を提供しない場合があります。
  • Django に特化しておらず、追加の構成が必要になる場合があります。

最適な代替方法の選択

最適な代替方法は、プロジェクトの要件と特定の状況によって異なります。

  • チームでの作業やデータベーススキーマの変更を厳格に管理する必要がある場合は、データベーススキーマバージョン管理ツール を検討してください。
  • より柔軟で強力なマイグレーションフレームワークが必要な場合は、South または Alembic を検討してください。
  • シンプルで軽量なソリューションが必要な場合は、手動で SQL を記述する

考慮事項

代替方法を選択する前に、以下の点を考慮する必要があります。

  • 将来の変更: ツールが将来の変更を容易にサポートできることを確認してください。
  • プロジェクトの要件: ツールがプロジェクトの特定の要件を満たしていることを確認してください。
  • チームのスキルセット: チームがツールの習得と使用に十分なスキルを持っていることを確認してください。
  • Django との互換性: 選択したツールが Django と互換性があることを確認してください。