#25530: Deferred SQL operations fail when a referenced table or column is renamed during the same migration ------------------------------+------------------------------------ Reporter: simonphilips | Owner: nobody Type: Bug | Status: new Component: Migrations | Version: 1.8 Severity: Normal | Resolution: Keywords: | Triage Stage: Accepted Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 ------------------------------+------------------------------------
Comment (by charettes): #26461 was a duplicate caused by an implicit table rename through a `RenameModel` operation. I think a possible solution would be to add state dependency tracking to `deferred_sql`. This way `RenameModel`, `AlterField`, `RenameField` and `AlterModelTable` operations could alter it to rename the references and `RemoveModel`, `RemoveField` operations could make sure to remove the unnecessary statements. For example, the `AddField` operation above would add a tuple of the form `('CREATE INDEX ...', [(ModelState('bug', 'child', [...]), 'child'), (ModelState('bug_parent', 'parent', [...]), 'id)]` (as it depends on both state and fields) and the `AlterField` operation would loop over all `editor.deferred_sql` and make sure to replace both the SQL and the state of items depending on the model state it's about to alter. Model level operations (`RenameModel`, `AlterModelTable`) could simply use `None` as field to denote they depend on the model state itself. As for the SQL replacing part I think it would make more sense to introduce a class encapsulating the statement format string and its dependency than naively performing `str.replace('old_table_name', 'new_table_name')` on the constructed SQL. This wrapper could also subclass `str` in order to maintain backward compatibility with the actual `deferred_sql` API. Thoughts? -- Ticket URL: <https://code.djangoproject.com/ticket/25530#comment:9> 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/070.8830e5f134f2ae2127b4ac3e947733b8%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.