#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.