Opened 19 months ago

Last modified 19 months ago

#34510 closed Uncategorized

sqlmigrate does not follows replaces in squashed migrations — at Version 3

Reported by: NeodymiumFerBore Owned by: nobody
Component: Core (Management commands) Version: 4.2
Severity: Normal Keywords: squashed migration replaces sqlmigrate command core management
Cc: NeodymiumFerBore, David Sanders Triage Stage: Unreviewed
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by NeodymiumFerBore)

Hello!

I actually don't know if this issue will end being a bug, a new feature or a documentation improvement.

The sqlmigrate command does not follow replaces in squashed migration, with original (squashed) migration files deleted. This ticket is roughly the same than #33583. In #31318, the issue is marked as solved with commit d883657. Since then, MigrationLoader accepts the argument replace_migrations. However, the loader instance here has this option to False. I don't see a command option to set it to True.

Sample error (not mine, but actually the exact same, taken from #33583):

python3 manage.py sqlmigrate beta 0003
Traceback (most recent call last):
  File "/Users/amin/sandbox/mysite/manage.py", line 22, in <module>
    main()
  File "/Users/amin/sandbox/mysite/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.9/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.9/site-packages/django/core/management/__init__.py", line 440, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.9/site-packages/django/core/management/base.py", line 414, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.9/site-packages/django/core/management/commands/sqlmigrate.py", line 38, in execute
    return super().execute(*args, **options)
  File "/usr/local/lib/python3.9/site-packages/django/core/management/base.py", line 460, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.9/site-packages/django/core/management/commands/sqlmigrate.py", line 46, in handle
    loader = MigrationLoader(connection, replace_migrations=False)
  File "/usr/local/lib/python3.9/site-packages/django/db/migrations/loader.py", line 58, in __init__
    self.build_graph()
  File "/usr/local/lib/python3.9/site-packages/django/db/migrations/loader.py", line 276, in build_graph
    self.graph.validate_consistency()
  File "/usr/local/lib/python3.9/site-packages/django/db/migrations/graph.py", line 198, in validate_consistency
    [n.raise_error() for n in self.node_map.values() if isinstance(n, DummyNode)]
  File "/usr/local/lib/python3.9/site-packages/django/db/migrations/graph.py", line 198, in <listcomp>
    [n.raise_error() for n in self.node_map.values() if isinstance(n, DummyNode)]
  File "/usr/local/lib/python3.9/site-packages/django/db/migrations/graph.py", line 60, in raise_error
    raise NodeNotFoundError(self.error_message, self.key, origin=self.origin)
django.db.migrations.exceptions.NodeNotFoundError: Migration beta.0001_initial dependencies reference nonexistent parent node ('first', '0001_initial')

I tried to set it to True manually in 4.1.7, and it successfully showed SQL queries involved in the migration I wanted to inspect. sqlmigrate.py has not changed between 4.1.7 and 4.2, so I guess it also affects it.

Link: MigrationLoader instance in 4.1.7 L46
Link: MigrationLoader instance in 4.2 L46
Link: MigrationLoader instance in main L46

I see that it always has been like this since commit d883657. Now maybe I don't understand why it works like so. Could you explain why it is set to False with no option to set it to True in sqlmigrate? Is it unreliable? In #33583, someone said:

replaces is documented and supported only for ​squashing migrations so described flow was never officially supported

Why not adding a command option to sqlmigrate to enable following replaces in squashed migration, with a warning like "experimental" or something?

Thank you.

Change History (3)

comment:1 by NeodymiumFerBore, 19 months ago

Cc: NeodymiumFerBore added
Description: modified (diff)

comment:2 by NeodymiumFerBore, 19 months ago

Description: modified (diff)

comment:3 by NeodymiumFerBore, 19 months ago

Description: modified (diff)
Type: BugUncategorized
Note: See TracTickets for help on using tickets.
Back to Top