sql >> Databasteknik >  >> RDS >> Mysql

Hur man skriver migrering för att ändra primärnyckeln för modellen med ManyToManyField

Så jag slutade med SQL för att fixa det. Kärnan i min lösning är nedan - i princip jag

  • skapa ett index på user_id i den nya profilen
    • det här indexet måste finnas innan jag kan referera till det som en främmande nyckel
  • skapa en ny genomgående tabell
    • Jag började med utdata från SHOW CREATE TABLE userprofile_userprofile_subjects (MySQL-specifik)
    • Jag ändrade nyckelnamnen och begränsningsnamnen något
  • kopiera all data till den nya genomgångstabellen
  • släpp den gamla genomgående tabellen
  • byt namn på den nya genomgående tabellen för att få namnet på den gamla genomgångstabellen
  • äntligen gör de operationer som django-migreringarna genererade automatiskt åt mig

Jag hoppas att detta hjälper någon annan. Och jag skulle fortfarande vara intresserad av att veta om en bättre lösning.

from django.db import migrations

class Migration(migrations.Migration):

    dependencies = [
        # ...
    ]

    operations = [
        migrations.RunSQL(
            'ALTER TABLE userprofile_userprofile '
            'ADD INDEX `userprofile_userprofile_1234abcd` (user_id)'
        ),
        migrations.RunSQL (
            'CREATE TABLE userprofile_temp_table ('
            '`id` int(11) NOT NULL AUTO_INCREMENT, '
            '`userprofile_id` int(11) NOT NULL, '
            '`subject_id` int(11) NOT NULL, '
            'PRIMARY KEY (`id`), '
            'UNIQUE KEY `userprofile_userprofile_subjects_userprofile_us_7ded3060_uniq` (`userprofile_id`,`subject_id`), '
            'KEY `userprofile_userprofile_subject_1be9924f` (`userprofile_id`), '
            'KEY `userprofile_userprofile_subject_e5a9504a` (`subject_id`), '
            'CONSTRAINT `subject_id_refs_id_69796996` FOREIGN KEY (`subject_id`) REFERENCES `otherapp_subject` (`id`), '
            'CONSTRAINT `userprofile_user_id_refs_user_id_1234abcd` FOREIGN KEY (`userprofile_id`) REFERENCES `userprofile_userprofile` (`user_id`) '
            ') ENGINE=InnoDB AUTO_INCREMENT=35500 DEFAULT CHARSET=utf8 '
        ),
        migrations.RunSQL (
            'INSERT INTO userprofile_temp_table '
            '(userprofile_id, subject_id) '
            '('
            '  SELECT userprofile_userprofile.user_id, userprofile_userprofile_subjects.subject_id'
            '    FROM userprofile_userprofile_subjects'
            '    INNER JOIN userprofile_userprofile'
            '    ON userprofile_userprofile_subjects.userprofile_id ='
            '        userprofile_userprofile.id'
            ')'
        ),
        migrations.RunSQL (
            'DROP TABLE `userprofile_userprofile_subjects`'
        ),
        migrations.RunSQL (
            'RENAME TABLE `userprofile_temp_table` TO `userprofile_userprofile_subjects`'
        ),
        migrations.RemoveField(
            model_name='userprofile',
            name='id',
        ),
        migrations.AlterField(
            model_name='userprofile',
            name='user',
            field=models.OneToOneField(
                primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL
            ),
            preserve_default=True,
        ),
    ]



  1. Undertryck varningsmeddelanden med mysql från terminalen, men lösenordet skrivet i bash-skript

  2. Hur man klona R12.2 miljö

  3. Importera export mysql databas kommandorad supersnabb

  4. Skapa ett SQL Server Agent Job i Azure Data Studio