Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak napisać migrację, aby zmienić klucz podstawowy modelu za pomocą ManyToManyField

Więc skończyłem z SQL, aby to naprawić. Rdzeń mojego rozwiązania znajduje się poniżej - w zasadzie ja

  • utwórz indeks dla user_id w nowym profilu
    • ten indeks musi istnieć, zanim będę mógł odwoływać się do niego jako do klucza obcego
  • utwórz nową tabelę za pomocą
    • Zacząłem od danych wyjściowych SHOW CREATE TABLE userprofile_userprofile_subjects (specyficzne dla MySQL)
    • Nieznacznie zmodyfikowałem nazwy kluczy i nazwy ograniczeń
  • skopiuj wszystkie dane do nowej tabeli przelotowej
  • upuść stary stół
  • zmień nazwę nowej tabeli przelotowej na nazwę starej tabeli przelotowej
  • na koniec wykonaj operacje, które migracje django automatycznie dla mnie wygenerowały

Mam nadzieję, że to pomoże komuś innemu. I nadal chciałbym wiedzieć o lepszym rozwiązaniu.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mapowanie pól procedury składowanej MySQL Entity Framework 4.0

  2. Zdobądź drugą najwyższą pensję dla każdej osoby w mysql

  3. wybieranie unikalnych wartości z kolumny

  4. Jak działa funkcja MID() w MySQL

  5. przekonwertuj wynik mysql na json z poprawnymi typami