#35422: Migration crash when renaming a field referenced in
GeneratedField.expression on SQLite
---------------------------------------+------------------------
               Reporter:  Sarah Boyce  |          Owner:  nobody
                   Type:  Bug          |         Status:  new
              Component:  Migrations   |        Version:  5.0
               Severity:  Normal       |       Keywords:
           Triage Stage:  Unreviewed   |      Has patch:  0
    Needs documentation:  0            |    Needs tests:  0
Patch needs improvement:  0            |  Easy pickings:  0
                  UI/UX:  0            |
---------------------------------------+------------------------
 Given a model (migrated) on SQLite
 {{{
 class Foo(models.Model):
     name = models.CharField(max_length=10)
     lower_name = models.GeneratedField(
         expression=Lower("name"),
         output_field=models.CharField(max_length=10),
         db_persist=True,
     )
 }}}
 when you update to
 {{{
 class Foo(models.Model):
     surname = models.CharField(max_length=10)
     lower_name = models.GeneratedField(
         expression=Lower("surname"),
         output_field=models.CharField(max_length=10),
         db_persist=True,
     )
 }}}
 and makemigrations, you then get asked `Was foo.name renamed to
 foo.surname (a CharField)? [y/N]` and say `y` (because it was)
 You then get a crash when migrating:


 {{{
 Operations to perform:
   Apply all migrations: app3
 Running migrations:
   Applying
 app3.0005_rename_name_foo_surname_alter_foo_lower_name...Traceback (most
 recent call last):
   File "path_to_project\mysite\manage.py", line 22, in <module>
     main()
   File "path_to_project\mysite\manage.py", line 18, in main
     execute_from_command_line(sys.argv)
   File "path_to_project\venv\Lib\site-
 packages\django\core\management\__init__.py", line 442, in
 execute_from_command_line
     utility.execute()
   File "path_to_project\venv\Lib\site-
 packages\django\core\management\__init__.py", line 436, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "path_to_project\venv\Lib\site-
 packages\django\core\management\base.py", line 413, in run_from_argv
     self.execute(*args, **cmd_options)
   File "path_to_project\venv\Lib\site-
 packages\django\core\management\base.py", line 459, in execute
     output = self.handle(*args, **options)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "path_to_project\venv\Lib\site-
 packages\django\core\management\base.py", line 107, in wrapper
     res = handle_func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "path_to_project\venv\Lib\site-
 packages\django\core\management\commands\migrate.py", line 356, in handle
     post_migrate_state = executor.migrate(
                          ^^^^^^^^^^^^^^^^^
   File "path_to_project\venv\Lib\site-
 packages\django\db\migrations\executor.py", line 135, in migrate
     state = self._migrate_all_forwards(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "path_to_project\venv\Lib\site-
 packages\django\db\migrations\executor.py", line 167, in
 _migrate_all_forwards
     state = self.apply_migration(
             ^^^^^^^^^^^^^^^^^^^^^
   File "path_to_project\venv\Lib\site-
 packages\django\db\migrations\executor.py", line 255, in apply_migration
     state = migration.apply(state, schema_editor)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "path_to_project\venv\Lib\site-
 packages\django\db\migrations\migration.py", line 132, in apply
     operation.database_forwards(
   File "path_to_project\venv\Lib\site-
 packages\django\db\migrations\operations\fields.py", line 241, in
 database_forwards
     schema_editor.alter_field(from_model, from_field, to_field)
   File "path_to_project\venv\Lib\site-
 packages\django\db\backends\base\schema.py", line 875, in alter_field
     or old_field.generated_sql(self.connection)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "path_to_project\venv\Lib\site-
 packages\django\db\models\fields\generated.py", line 58, in generated_sql
     resolved_expression = self.expression.resolve_expression(
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "path_to_project\venv\Lib\site-
 packages\django\db\models\expressions.py", line 1052, in
 resolve_expression
     c.source_expressions[pos] = arg.resolve_expression(
                                 ^^^^^^^^^^^^^^^^^^^^^^^
   File "path_to_project\venv\Lib\site-
 packages\django\db\models\expressions.py", line 874, in resolve_expression
     return query.resolve_ref(self.name, allow_joins, reuse, summarize)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "path_to_project\venv\Lib\site-
 packages\django\db\models\sql\query.py", line 2010, in resolve_ref
     join_info = self.setup_joins(
                 ^^^^^^^^^^^^^^^^^
   File "path_to_project\venv\Lib\site-
 packages\django\db\models\sql\query.py", line 1863, in setup_joins
     path, final_field, targets, rest = self.names_to_path(
                                        ^^^^^^^^^^^^^^^^^^^
   File "path_to_project\venv\Lib\site-
 packages\django\db\models\sql\query.py", line 1768, in names_to_path
     raise FieldError(
 django.core.exceptions.FieldError: Cannot resolve keyword 'name' into
 field. Choices are: id, lower_name, surname
 }}}
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35422>
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018f398f1d89-62bcf223-e3da-485c-a79d-748690c55797-000000%40eu-central-1.amazonses.com.

Reply via email to