#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.