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

Reply via email to