#36947: Changing a field's db_comment unnecessarily alters column type
------------------------------+-----------------------------------------
     Reporter:  Alex Fischer  |                    Owner:  Clifford Gama
         Type:  Bug           |                   Status:  assigned
    Component:  Migrations    |                  Version:  6.0
     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
------------------------------+-----------------------------------------
Changes (by Clifford Gama):

 * summary:  Changing db_comment / GeneratedField error => Changing a
     field's db_comment unnecessarily alters column type


Old description:

> Django==5.2.11
> Postgres 16.2
>
> With this model definition:
>
> {{{
> class Foo(models.Model):
>     foo = models.IntegerField()
>     foo_copy = models.GeneratedField(
>         expression=models.F("foo"),
>         output_field=models.IntegerField(),
>         db_persist=True,
>     )
> }}}
>
> makemigrations and migrate run fine.
>
> Now add a db_comment to foo:
> {{{
> class Foo(models.Model):
>     foo = models.IntegerField(db_comment="foo")
>     foo_copy = models.GeneratedField(
>         expression=models.F("foo"),
>         output_field=models.IntegerField(),
>         db_persist=True,
>     )
> }}}
>
> Now  if we makemigrations and migrate again, we get the following error:
> {{{
> django.db.utils.NotSupportedError: cannot alter type of a column used by
> a generated column
> DETAIL:  Column "foo" is used by generated column "foo_copy".
> }}}
>
> Running sqlmigrate on the migration that was produced, we can see what
> the migration is trying to perform:
> {{{
> BEGIN;
> --
> -- Alter field foo on foo
> --
> ALTER TABLE "my_app_foo" ALTER COLUMN "foo" TYPE integer;
> COMMENT ON COLUMN "issue_tracker_foo"."foo" IS 'foo';
> COMMIT;
> }}}
>
> I don't know why it runs the first ALTER COLUMN statement. The ALTER
> COLUMN statement is a no-op most of the time, and that's fine. But in
> this case, it throws an error in Postgres ("cannot alter type of a column
> used by a generated column").

New description:

 (On databases that support altering the comment independently of the
 type.)

 Django==5.2.11
 Postgres 16.2

 With this model definition:

 {{{
 class Foo(models.Model):
     foo = models.IntegerField()
     foo_copy = models.GeneratedField(
         expression=models.F("foo"),
         output_field=models.IntegerField(),
         db_persist=True,
     )
 }}}

 makemigrations and migrate run fine.

 Now add a db_comment to foo:
 {{{
 class Foo(models.Model):
     foo = models.IntegerField(db_comment="foo")
     foo_copy = models.GeneratedField(
         expression=models.F("foo"),
         output_field=models.IntegerField(),
         db_persist=True,
     )
 }}}

 Now  if we makemigrations and migrate again, we get the following error:
 {{{
 django.db.utils.NotSupportedError: cannot alter type of a column used by a
 generated column
 DETAIL:  Column "foo" is used by generated column "foo_copy".
 }}}

 Running sqlmigrate on the migration that was produced, we can see what the
 migration is trying to perform:
 {{{
 BEGIN;
 --
 -- Alter field foo on foo
 --
 ALTER TABLE "my_app_foo" ALTER COLUMN "foo" TYPE integer;
 COMMENT ON COLUMN "issue_tracker_foo"."foo" IS 'foo';
 COMMIT;
 }}}

 I don't know why it runs the first ALTER COLUMN statement. The ALTER
 COLUMN statement is a no-op most of the time, and that's fine. But in this
 case, it throws an error in Postgres ("cannot alter type of a column used
 by a generated column").

--
-- 
Ticket URL: <https://code.djangoproject.com/ticket/36947#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 visit 
https://groups.google.com/d/msgid/django-updates/0107019caace32d8-9308e46f-033f-4d96-841e-35e2798bd8e4-000000%40eu-central-1.amazonses.com.

Reply via email to