Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да напиша миграция за промяна на първичния ключ на модела с ManyToManyField

Така че се оказах със SQL, за да го поправя. Ядрото на моето решение е по-долу - основно аз

  • създайте индекс на user_id в новия профил
    • този индекс трябва да съществува, преди да мога да се позова на него като външен ключ
  • създайте нова чрез таблица
    • Започнах с изхода на SHOW CREATE TABLE userprofile_userprofile_subjects (специфично за MySQL)
    • Промених леко имената на ключовете и ограниченията
  • копирайте всички данни в новата чрез таблица
  • изхвърлете старата таблица
  • преименувайте новата крайна таблица, за да има името на старата таблица
  • най-накрая извършете операциите, които django миграцията автоматично генерира за мен

Надявам се това да помогне на някой друг. И все пак ще ми е интересно да разбера за по-добро решение.

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. неочакван T_ENCAPSED_AND_WHITESPACE, очаква се T_STRING или T_VARIABLE или T_NUM_STRING грешка

  2. MariaDb SQL инжекция

  3. Как да проверя дали два периода от време се припокриват в mysql?

  4. MySQL заявка за намиране на клиенти, които са поръчали два конкретни продукта

  5. вмъкване на данни от една таблица в друга в mysql