LoginSignup
0
0

Djangoのマイグレーション実行時に独自のクエリを実行する

Posted at

マイグレーションファイルにmigrations.RunPythonで処理を書くと実行されます

例(テーブルを作成した後にマスタデータを入れる)

# Generated by Django 3.2.18 on 2023-05-22 02:24

from django.db import migrations, models
import django.db.models.deletion

def insert_member_status(apps, schema_editor):
    from api.models.member_status import MemberStatus
    MemberStatus(name='仮会員').save()
    MemberStatus(name='本会員').save()
    MemberStatus(name='退会').save()
    MemberStatus(name='メルマガ会員').save()

class Migration(migrations.Migration):

    dependencies = [
        ('api', '0152_auto_20230517_1058'),
    ]

    operations = [
        migrations.CreateModel(
            name='MemberStatus',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=255)),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated')),
                ('deleted_at', models.DateTimeField(blank=True, null=True, verbose_name='deleted')),
            ],
            options={
                'abstract': False,
            },
        ),
        # マスタデータを入れる
        migrations.RunPython(insert_member_status),
    ]

直接クエリで書くこともできます

from django.db import connection

def insert_member_status(apps, schema_editor):
    with connection.cursor() as cursor:
        sql = """
        INSERT INTO `api_member_status` (`name`, `created_at`, `updated_at`, `deleted_at`)
        VALUES
            ('仮会員', '2023-06-02 00:00:00.000000', '2023-06-02 00:00:00.000000', NULL),
            ('本会員', '2023-06-02 00:00:00.000000', '2023-06-02 00:00:00.000000', NULL),
            ('退会', '2023-06-02 00:00:00.000000', '2023-06-02 00:00:00.000000', NULL),
            ('メルマガ会員', '2023-06-02 00:00:00.000000', '2023-06-02 00:00:00.000000', NULL);
        """
        cursor.execute(sql)
        cursor.fetchone()

        sql = """
        UPDATE api_csvtypes SET is_update_only = 1, skip_function = "sales_plan_skip" WHERE id = 14;
        """
        cursor.execute(sql)
        cursor.fetchone()

あとDjangoのマイグレーションで作られないALTER文流したりとかもできると思います

0
0
0

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
0
0