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. PostgreSQLとOracleGTTの一時テーブルの比較

    2. MySQL接続文字列をApp.configに保存する場合、providerNameプロパティをどの値に設定する必要がありますか?

    3. Postgresqlの切り捨て速度

    4. MySQLをMariaDB10にアップグレードします(パート2 – MariaDB / MySQL 5.5をバージョン10.0にアップグレードします)