4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Djangoのmigration機能でDBモックデータを投入しよう!

Last updated at Posted at 2025-02-16

本記事は開発初期段階やハッカソンなどでDBレコード,migrationsファイルの削除が許容される場合を想定し、手順を記載しております。

1. 手順

DBにある既存データは、下記コマンドにより削除されます。
実行する際はご注意ください。

たったこれだけの手間!

コマンドは たった5つ 叩くだけです。
慣れていない方でもほぼ確実に再現できるやり方です!

まずは操作手順からどうぞ。
(パスはご自身の環境に合わせて編集してください)

ローカル環境での実行

# DBデータを削除
python manage.py flush

# マイグレーションファイルを削除(__init__.pyは残す)
rm app/migrations/0*.py

# マイグレーションを再作成
python manage.py makemigrations

"""
ここで後に解説するマイグレーションファイルをapp/migrations/配下に作成(配置)します。
"""

# マイグレーションを実行
python manage.py migrate

Docker環境への実行

# DBデータを削除
docker-compose exec web python manage.py flush

# マイグレーションファイルを削除(__init__.pyは残す)
rm app/migrations/0*.py

# マイグレーションを再作成
docker-compose exec web python manage.py makemigrations

"""
ここで後に解説するマイグレーションファイルをapp/migrations/配下に作成(配置)します。
"""

# マイグレーションを実行
docker-compose exec web python manage.py migrate

2. モックデータの作成と投入

models.py の記述が正しくされていることが前提になります。

  1. models.pyの内容を生成AIに読ませる

  2. 「"migrations.RunPython"を使用してモックデータを作成」と指示

  3. 生成されたコードをマイグレーションファイルとして保存

    • 保存先:migrations/0002_[説明的な名前].py
    • 例:migrations/0002_add_mock_data.py

下記のようなコードが生成されます。

# 生成されたコード例
from django.db import migrations
from django.utils import timezone

def create_initial_data(apps, schema_editor):
    User = apps.get_model('app', 'User')
    
    users = [
        User(
            id=1,
            username='test_user1',
            email='test1@example.com',
            password='password123',
            created_at=timezone.now(),
            updated_at=timezone.now()
        ),
    ]
    User.objects.bulk_create(users)

def remove_initial_data(apps, schema_editor):
    User = apps.get_model('app', 'User')
    User.objects.all().delete()

class Migration(migrations.Migration):
    dependencies = [
        ('app', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(create_initial_data, remove_initial_data),
    ]

生成AIの作成するデータが正しいかどうかはご自身で確認ください。

3. migrations.RunPythonの解説

migrations.RunPythonは、Djangoのマイグレーション機能の一つで、Pythonコードを使ってデータベースを操作するためのメソッドです。

主な用途

  • 初期データの投入
  • 既存データの変更
  • データの移行処理
  • カスタムデータ操作

基本構造

migrations.RunPython(
    forwards_func,  # マイグレーション適用時の関数
    reverse_func   # ロールバック時の関数
)

動作の仕組み

  1. マイグレーション適用時(python manage.py migrate
    forwards_funcが実行されデータベースへの変更が行われる

  2. ロールバック時(python manage.py migrate app 0001など)
    reverse_funcが実行され変更が元に戻される

あとがき

今回は限定的な場面での実施手順を書きましたが、migrations.RunPythonやmigrationはまだまだ奥が深く、既存のデータを活かした実装もいけるようでした。
検証用データなどは実務でも使う機会が多いため、この辺りのスキルは実は重要な気がしています。
個人的にこういった開発に付随して必要な技術や知識はもっと深めていきたいです。

最後まで拝読いただきありがとうございました。

4
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?