Opened 3 weeks ago

Last modified 2 weeks ago

#36947 assigned Bug

Changing a field's db_comment unnecessarily alters column type

Reported by: Alex Fischer Owned by: Clifford Gama
Component: Migrations Version: 6.0
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Clifford Gama)

(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").

Change History (3)

comment:1 by Clifford Gama, 3 weeks ago

Component: UncategorizedMigrations
Owner: set to Clifford Gama
Status: newassigned
Triage Stage: UnreviewedAccepted
Type: UncategorizedBug

Thanks for the ticket. I don't think we should be altering the column type when it hasn't changed. I'll investigate a fix.

comment:2 by Clifford Gama, 2 weeks ago

Description: modified (diff)
Summary: Changing db_comment / GeneratedField errorChanging a field's db_comment unnecessarily alters column type

comment:3 by Clifford Gama, 2 weeks ago

Has patch: set
Note: See TracTickets for help on using tickets.
Back to Top