Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara menulis migrasi untuk mengubah kunci utama model dengan ManyToManyField

Jadi saya berakhir dengan SQL untuk memperbaikinya. Inti dari solusi saya ada di bawah - pada dasarnya saya

  • buat indeks pada user_id di profil baru
    • indeks ini harus ada sebelum saya dapat mereferensikannya sebagai kunci asing
  • buat tabel baru melalui
    • Saya mulai dengan keluaran SHOW CREATE TABLE userprofile_userprofile_subjects (khusus MySQL)
    • Saya sedikit mengubah nama kunci dan nama batasan
  • salin semua data ke tabel through baru
  • lepaskan yang lama melalui tabel
  • ganti nama tabel through baru menjadi nama tabel through lama
  • akhirnya lakukan operasi yang dibuat secara otomatis oleh migrasi Django untuk saya

Saya harap ini membantu orang lain. Dan saya masih tertarik untuk mengetahui tentang solusi yang lebih baik.

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. xampp mysql dan phpmyadmin tidak berfungsi

  2. SQL meminta beberapa tabel, dengan beberapa gabungan dan bidang kolom dengan daftar yang dipisahkan koma

  3. mysql.sock hilang; menghasilkan OperationalError:(2002, Tidak dapat terhubung ke server MySQL lokal melalui soket '/tmp/mysql.sock' (2))

  4. Kinerja MySQL:Pengantar GABUNG dalam SQL

  5. Apakah ada alasan untuk khawatir tentang urutan kolom dalam tabel?