#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 Mike Edmunds): Still seems to be an issue in Django 2.0.5. The source of the problem appears to be BaseDatabaseSchemaEditor._alter_field in django.db.backends.base.schema. It ''unconditionally'' [https://github.com/django/django/blob/2.0.5/django/db/backends/base/schema.py#L530-L542 drops any existing foreign key constraint(s)] and [https://github.com/django/django/blob/2.0.5/django/db/backends/base/schema.py#L530-L542 later re-creates it]—whether or not anything is changing. (It seems to be more selective about dropping other types of constraints only if the field is changing in a way that impacts them.) The [https://github.com/django/django/commit/a92bae0f0622fb45afb94bf5448b49bc32ebb643 origin of this code] is 2012, I think during initial implementation of Django migrations. Are there non-obvious field changes where the field's FK constraint needs to be dropped and re-created? Or some other reason this code runs unconditionally? Optimization around other field changes? A fix might be to defer dropping the FK constraint until just before the field's actions/null_actions/post_actions are collected and ready to be applied (around line 650), and then drop it only if there are actually actions to execute. -- Ticket URL: <https://code.djangoproject.com/ticket/25253#comment:14> 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.780dd0a5206dc6eb5fd736b5d643ae6c%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.