#25253: MySQL migrations drop & recreate constraints unnecessarily when changing
attributes that don't affect the schema
--------------------------------------+------------------------------------
     Reporter:  Thomas Recouvreux     |                    Owner:  Shun Yu
         Type:  Cleanup/optimization  |                   Status:  assigned
    Component:  Migrations            |                  Version:  1.8
     Severity:  Normal                |               Resolution:
     Keywords:  migrations m2m mysql  |             Triage Stage:  Accepted
    Has patch:  0                     |      Needs documentation:  0
  Needs tests:  0                     |  Patch needs improvement:  0
Easy pickings:  0                     |                    UI/UX:  0
--------------------------------------+------------------------------------

Comment (by Shun Yu):

 Just for clarity, this seems to be a MySQL specific symptom. I tried using
 PostgreSQL 9.5.8 and Django 2.0.dev and could not replicate the add/drop
 of indices.

 {{{
 from django.db import models
 from django.contrib.auth.models import User

 class Banana(models.Model):
     - users = models.ForeignKey(User, on_delete=models.CASCADE)
     + users = models.ForeignKey(User, on_delete=models.PROTECT)
 }}}

 {{{
 class Migration(migrations.Migration):

     dependencies = [
         ('banana', '0001_initial'),
     ]

     operations = [
         migrations.AlterField(
             model_name='banana',
             name='users',
 field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
 to=settings.AUTH_USER_MODEL),
         ),
     ]
 }}}

 {{{
 $ python manage.py sqlmigrate --database mysql banana 0001
 BEGIN;
 --
 -- Create model Banana
 --
 CREATE TABLE `banana_banana` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY
 KEY, `users_id` integer NOT NULL);
 ALTER TABLE `banana_banana` ADD CONSTRAINT
 `banana_banana_users_id_b9f5715e_fk_auth_user_id` FOREIGN KEY (`users_id`)
 REFERENCES `auth_user` (`id`);
 COMMIT;

 $ python manage.py sqlmigrate --database mysql banana 0002
 BEGIN;
 --
 -- Alter field users on banana
 --
 ALTER TABLE `banana_banana` DROP FOREIGN KEY
 `banana_banana_users_id_b9f5715e_fk_auth_user_id`;
 ALTER TABLE `banana_banana` ADD CONSTRAINT
 `banana_banana_users_id_b9f5715e_fk_auth_user_id` FOREIGN KEY (`users_id`)
 REFERENCES `auth_user` (`id`);
 COMMIT;
 }}}

 {{{
 $ python manage.py sqlmigrate --database postgres banana 0001
 BEGIN;
 --
 -- Create model Banana
 --
 CREATE TABLE "banana_banana" ("id" serial NOT NULL PRIMARY KEY, "users_id"
 integer NOT NULL);
 ALTER TABLE "banana_banana" ADD CONSTRAINT
 "banana_banana_users_id_b9f5715e_fk_auth_user_id" FOREIGN KEY ("users_id")
 REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED;
 CREATE INDEX "banana_banana_users_id_b9f5715e" ON "banana_banana"
 ("users_id");
 COMMIT;

 $ python manage.py sqlmigrate --database postgres banana 0002
 BEGIN;
 --
 -- Alter field users on banana
 --
 COMMIT;
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/25253#comment:12>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/066.1f1b7516e7c171280dd460932846858c%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to