本記事は開発初期段階やハッカソンなどで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 の記述が正しくされていることが前提になります。
-
models.py
の内容を生成AIに読ませる -
「"migrations.RunPython"を使用してモックデータを作成」と指示
-
生成されたコードをマイグレーションファイルとして保存
- 保存先:
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 # ロールバック時の関数
)
動作の仕組み
-
マイグレーション適用時(
python manage.py migrate
)
forwards_func
が実行されデータベースへの変更が行われる -
ロールバック時(
python manage.py migrate app 0001
など)
reverse_func
が実行され変更が元に戻される