#34510 closed Uncategorized (invalid)
sqlmigrate does not follows replaces in squashed migrations
| 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 )
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:
replacesis 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 (5)
comment:1 by , 3 years ago
| Cc: | added |
|---|---|
| Description: | modified (diff) |
comment:2 by , 3 years ago
| Description: | modified (diff) |
|---|
comment:3 by , 3 years ago
| Description: | modified (diff) |
|---|---|
| Type: | Bug → Uncategorized |
comment:4 by , 3 years ago
| Resolution: | → invalid |
|---|---|
| Status: | new → closed |
comment:5 by , 3 years ago
| Cc: | added |
|---|
Hello,
Sorry I don't think there is any issue here.
The documentation states when removing replaced migrations, the
replacesattributes must also be removed.I ran a test to see if there were any issues with sqlmigrate & deleted squashed migrations and it behaves as expected.
Closing as invalid. If there's any extra information that comes to light or if there's something that I'm missing here feel free to add a comment 👍