#24892 closed Bug (fixed)
Django migrations don't escape uppercase table name in "" when using postgres backend when changing Integer field to Auto field
Reported by: | Jacek Bzdak | Owned by: | Tim Graham |
---|---|---|---|
Component: | Migrations | Version: | 1.8 |
Severity: | Release blocker | 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 )
To cut long story short: in a small application I had models using domain level primary keys, that were strings, I wanted to introduce synthetic primary keys.
Here are models before migration (I have updated int_pk
to be unique).
class Foo(models.Model): string_pk = models.CharField( max_length=10, primary_key= True ) int_pk = models.IntegerField( null=True ) class Meta: db_table = "FOO"
Models after migration:
class Foo(models.Model): string_pk = models.CharField( max_length=10, unique = True ) int_pk = models.AutoField( primary_key=True ) class Meta: db_table = "FOO"
Generated migration:
class Migration(migrations.Migration): dependencies = [ ('testapp', '0002_foo_int_pk'), ] operations = [ migrations.AlterField( model_name='foo', name='int_pk', field=models.AutoField(primary_key=True, serialize=False), ), migrations.AlterField( model_name='foo', name='string_pk', field=models.CharField(max_length=10, unique=True), ), ]
This migration fails with following error:
django.db.utils.ProgrammingError: relation "foo" does not exist
Generated SQL is:
ALTER TABLE "FOO" ALTER COLUMN "int_pk" TYPE integer, ALTER COLUMN "int_pk" SET NOT NULL; DROP SEQUENCE IF EXISTS FOO_int_pk_seq CASCADE; CREATE SEQUENCE FOO_int_pk_seq; ALTER TABLE FOO ALTER COLUMN int_pk SET DEFAULT nextval('FOO_int_pk_seq'); SELECT setval('FOO_int_pk_seq', MAX(int_pk)) FROM FOO; ALTER TABLE "FOO" ADD CONSTRAINT "FOO_int_pk_5b283460a20ef820_uniq" UNIQUE ("int_pk"); ALTER TABLE "FOO" DROP CONSTRAINT "FOO_pkey"; ALTER TABLE "FOO" ADD CONSTRAINT "FOO_int_pk_5b283460a20ef820_pk" PRIMARY KEY ("int_pk");
Error is caused by wollowing two lines:
ALTER TABLE FOO ALTER COLUMN int_pk SET DEFAULT nextval('FOO_int_pk_seq'); SELECT setval('FOO_int_pk_seq', MAX(int_pk)) FROM FOO;
In these lines FOO
should be replaced by "FOO"
.
I use Django 1.8.2
.
Attachments (1)
Change History (6)
by , 10 years ago
Attachment: | testapp.tar.gz added |
---|
comment:1 by , 10 years ago
Description: | modified (diff) |
---|
comment:2 by , 10 years ago
Owner: | changed from | to
---|---|
Severity: | Normal → Release blocker |
Status: | new → assigned |
Triage Stage: | Unreviewed → Accepted |
UI/UX: | unset |
Note:
See TracTickets
for help on using tickets.
Application that reproduces this problem.