#24757: Removing unique_together constraint make Django 1.8 migration fail with
MySQL
-------------------------------+------------------------------
Reporter: trecouvr | Owner: nobody
Type: Uncategorized | Status: new
Component: Migrations | Version: 1.8
Severity: Normal | Keywords: migrations mysql
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+------------------------------
Migrations containing `migrations.AlterUniqueTogether(name='xxx',
unique_together=set([]),)` may fail on Django 1.8 but not on Django 1.7 if
using the backend mysql.
Given the database engine is mysql and the following `models.py`:
{{{
from django.db import models
class MyModelA(models.Model):
s = models.CharField(max_length=120)
class MyModelB(models.Model):
a = models.ForeignKey(MyModelA)
b = models.IntegerField()
}}}
And the 2 following migrations:
{{{
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.CreateModel(
name='MyModelA',
fields=[
('id', models.AutoField(serialize=False,
auto_created=True, verbose_name='ID', primary_key=True)),
('s', models.CharField(max_length=120)),
],
),
migrations.CreateModel(
name='MyModelB',
fields=[
('id', models.AutoField(serialize=False,
auto_created=True, verbose_name='ID', primary_key=True)),
('b', models.IntegerField()),
('a', models.ForeignKey(to='mysite.MyModelA')),
],
),
migrations.AlterUniqueTogether(
name='mymodelb',
unique_together=set([('a', 'b')]),
),
]
}}}
{{{
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('mysite', '0001_initial'),
]
operations = [
migrations.AlterUniqueTogether(
name='mymodelb',
unique_together=set([]),
),
]
}}}
Running `./manage.py migrate` works fine on Django 1.7, but on Django 1.8
I get the following error:
{{{
$ ./manage.py migrate
Operations to perform:
Synchronize unmigrated apps: staticfiles, messages
Apply all migrations: contenttypes, auth, mysite, sessions, admin
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
[..]
Applying mysite.0001_initial... OK
Applying mysite.0002_auto...Traceback (most recent call last):
[..]
django.db.utils.OperationalError: (1553, "Cannot drop index
'mysite_mymodelb_a_id_b53c781c93aab9a_uniq': needed in a foreign key
constraint")
}}}
The same migrations work on psql, I did not have the chance to test it
against sqlite.
Inspecting the generated sql I found Django 1.7 add an index in addition
to the unique constraint and Django 1.8 does not.
On Django 1.7
{{{
BEGIN;
CREATE TABLE `mysite_mymodela` (`id` integer AUTO_INCREMENT NOT NULL
PRIMARY KEY, `s` varchar(120) NOT NULL);
CREATE TABLE `mysite_mymodelb` (`id` integer AUTO_INCREMENT NOT NULL
PRIMARY KEY, `b` integer NOT NULL, `a_id` integer NOT NULL);
ALTER TABLE `mysite_mymodelb` ADD CONSTRAINT
`mysite_mymodelb_a_id_48275010b87402ed_uniq` UNIQUE (`a_id`, `b`);
ALTER TABLE `mysite_mymodelb` ADD CONSTRAINT
`mysite_mymodelb_a_id_4981d3920f0fef1e_fk_mysite_mymodela_id` FOREIGN KEY
(`a_id`) REFERENCES `mysite_mymodela` (`id`);
CREATE INDEX `mysite_mymodelb_e2b453f4` ON `mysite_mymodelb` (`a_id`);
COMMIT;
}}}
Note the {{{CREATE INDEX `mysite_mymodelb_e2b453f4` ON `mysite_mymodelb`
(`a_id`);}}}.
And on Django 1.8
{{{
BEGIN;
CREATE TABLE `mysite_mymodela` (`id` integer AUTO_INCREMENT NOT NULL
PRIMARY KEY, `s` varchar(120) NOT NULL);
CREATE TABLE `mysite_mymodelb` (`id` integer AUTO_INCREMENT NOT NULL
PRIMARY KEY, `b` integer NOT NULL, `a_id` integer NOT NULL);
ALTER TABLE `mysite_mymodelb` ADD CONSTRAINT
`mysite_mymodelb_a_id_784bb266d0e363ab_uniq` UNIQUE (`a_id`, `b`);
ALTER TABLE `mysite_mymodelb` ADD CONSTRAINT
`mysite_mymodelb_a_id_50892c78e36678b8_fk_mysite_mymodela_id` FOREIGN KEY
(`a_id`) REFERENCES `mysite_mymodela` (`id`);
COMMIT;
}}}
I joined the full traceback.
--
Ticket URL: <https://code.djangoproject.com/ticket/24757>
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/051.dad297614655e202a9a0278d8c7fdf28%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.