#24893: Django migrations don't add unique constraint for field that is changed
from primary_key to unique
----------------------------+--------------------------------------
Reporter: jbzdak | Owner: nobody
Type: Bug | Status: new
Component: Migrations | Version: 1.8
Severity: Normal | Resolution:
Keywords: | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
----------------------------+--------------------------------------
Changes (by jbzdak):
* needs_better_patch: => 0
* needs_tests: => 0
* needs_docs: => 0
Old description:
> This is related to #24892 and uses the same code (I have attached sample
> project there)
>
> Copy-pasted description of problem:
>
> > 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),
> > ),
> > ]
> > }}}
>
> I have changed field `string_pk` from `primary_key=True` to
> `unique=True`, generated migration (when I manually fixed error from
> #24892) didn't create unique constraint (previously there were a primary
> key constraint, that was dropped but there were no unique key generated).
>
> This can be (worked-around) by generating another migration with two
> `migrations.AlterField` one that sets `unique=False` and another that
> sets `unique=True`.
New description:
This is related to #24892 and uses the same code (I have attached sample
project there)
Copy-pasted description of problem:
> 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),
> ),
> ]
> }}}
I have changed field `string_pk` from `primary_key=True` to `unique=True`,
generated migration (when I manually fixed error from #24892) didn't
create unique constraint (previously there were a primary key constraint,
that was dropped but there were no unique key generated).
This can be worked-around by generating another migration with two
`migrations.AlterField` one that sets `unique=False` and another that sets
`unique=True`.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/24893#comment:1>
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 post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/064.d9b0bda745a91487fa6962c78e0ded4c%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.