0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?