#33197: Renaming field and providing prior field name to db_column should be an 
SQL
noop
--------------------------------------+------------------------------------
     Reporter:  Jacob Walls           |                    Owner:  nobody
         Type:  Cleanup/optimization  |                   Status:  new
    Component:  Migrations            |                  Version:  dev
     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
--------------------------------------+------------------------------------

Old description:

> Similar to #31826, I would expect no migration changes detected when a
> `db_column` is added that matches the implicit field name. I tested with
> and without renaming the field on SQLite and MySQL 5.7.31. I'm not
> familiar enough with the review of #31826 to know whether these are
> distinct cases versus if it should be reopened.
>
> {{{
> class Apple(models.Model):
>     core = models.BooleanField()
> }}}
>
> {{{
> class Apple(models.Model):
>     core_renamed = models.BooleanField(db_column='core')
> }}}
> {{{
> Was apple.core renamed to apple.core_renamed (a BooleanField)? [y/N] y
> Migrations for 'renamez':
>   renamez/migrations/0002_rename_core_apple_core_renamed_and_more.py
>     - Rename field core on apple to core_renamed
>     - Alter field core_renamed on apple
> }}}
>
> `python manage.py sqlmigrate renamez 0002` showing unnecessary SQL:
> {{{
> BEGIN;
> --
> -- Rename field core on apple to core_renamed
> --
> ALTER TABLE "renamez_apple" RENAME COLUMN "core" TO "core_renamed";
> --
> -- Alter field core_renamed on apple
> --
> ALTER TABLE "renamez_apple" RENAME COLUMN "core_renamed" TO "core";
> COMMIT;
> }}}
>
> Without renaming the field, follow the same flow and get an `AlterField`
> migration without SQL:
>
> {{{
> BEGIN;
> --
> -- Alter field core on apple
> --
> COMMIT;
> }}}

New description:

 Renaming a field and setting the prior implicit field name as the
 `db_column` to avoid db operations creates a migration emitting
 unnecessary SQL. Similar to #31826, which handled a very similar scenario
 but where there is no field rename, I would expect a SQL noop. I tested
 with SQLite and MySQL 5.7.31.

 {{{
 class Apple(models.Model):
     core = models.BooleanField()
 }}}

 {{{
 class Apple(models.Model):
     core_renamed = models.BooleanField(db_column='core')
 }}}
 {{{
 Was apple.core renamed to apple.core_renamed (a BooleanField)? [y/N] y
 Migrations for 'renamez':
   renamez/migrations/0002_rename_core_apple_core_renamed_and_more.py
     - Rename field core on apple to core_renamed
     - Alter field core_renamed on apple
 }}}

 `python manage.py sqlmigrate renamez 0002` showing unnecessary SQL:
 {{{
 BEGIN;
 --
 -- Rename field core on apple to core_renamed
 --
 ALTER TABLE "renamez_apple" RENAME COLUMN "core" TO "core_renamed";
 --
 -- Alter field core_renamed on apple
 --
 ALTER TABLE "renamez_apple" RENAME COLUMN "core_renamed" TO "core";
 COMMIT;
 }}}

 Without renaming the field, follow the same flow and get an `AlterField`
 migration without SQL, which is what #31826 intended:

 {{{
 BEGIN;
 --
 -- Alter field core on apple
 --
 COMMIT;
 }}}

--

Comment (by Jacob Walls):

 Thanks for having a look. I see now the scope of #31826 was just for flows
 where the field is not renamed. So that makes this ticket a request to
 extend this to field renames, which looks like was discussed as 3 and 4
 [https://code.djangoproject.com/ticket/29245#comment:1 here].

 > I assume the issue goes away if you swap the order of operations in your
 migration?

 If I switch the order to have `AlterField` followed by `RenameField`,
 `FieldDoesNotExist` is raised when migrating. These are the operations:

 {{{
     operations = [
         migrations.RenameField(
             model_name='apple',
             old_name='core',
             new_name='core_renamed',
         ),
         migrations.AlterField(
             model_name='apple',
             name='core_renamed',
             field=models.BooleanField(db_column='core'),
         ),
     ]
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/33197#comment:2>
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/073.e71ac5a87dc69b14fbb4e7cea5379da3%40djangoproject.com.

Reply via email to