#22844: SQLite3 migrations fail with unique_together on a ForeignKey
-------------------------------+--------------------------------
     Reporter:  fongandrew     |      Owner:  nobody
         Type:  Uncategorized  |     Status:  new
    Component:  Uncategorized  |    Version:  1.7-beta-2
     Severity:  Normal         |   Keywords:  migrations, sqlite
 Triage Stage:  Unreviewed     |  Has patch:  0
Easy pickings:  0              |      UI/UX:  0
-------------------------------+--------------------------------
 This models.py:

 {{{
 from django.db import models
 from django.contrib.auth.models import User

 class DropboxAccount(models.Model):
     """
     A Dropbox account linked to an existing user account
     """
     user = models.ForeignKey(User)
     dropbox_uid = models.CharField(max_length=32)
     class Meta:
         unique_together = (
             ("user", "dropbox_uid"),
         )
 }}}

 creates the following exception during migration:

 {{{
 Creating test database for alias 'default'...
 Traceback (most recent call last):
   File "manage.py", line 10, in <module>
     execute_from_command_line(sys.argv)
   File
 "/home/vagrant/deployment/src/django/django/core/management/__init__.py",
 line 385, in execute_from_command_line
     utility.execute()
   File
 "/home/vagrant/deployment/src/django/django/core/management/__init__.py",
 line 377, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File
 "/home/vagrant/deployment/src/django/django/core/management/commands/test.py",
 line 50, in run_from_argv
     super(Command, self).run_from_argv(argv)
   File
 "/home/vagrant/deployment/src/django/django/core/management/base.py", line
 288, in run_from_argv
     self.execute(*args, **options.__dict__)
   File
 "/home/vagrant/deployment/src/django/django/core/management/commands/test.py",
 line 71, in execute
     super(Command, self).execute(*args, **options)
   File
 "/home/vagrant/deployment/src/django/django/core/management/base.py", line
 337, in execute
     output = self.handle(*args, **options)
   File
 "/home/vagrant/deployment/src/django/django/core/management/commands/test.py",
 line 88, in handle
     failures = test_runner.run_tests(test_labels)
   File "/home/vagrant/deployment/src/django/django/test/runner.py", line
 147, in run_tests
     old_config = self.setup_databases()
   File "/home/vagrant/deployment/src/django/django/test/runner.py", line
 109, in setup_databases
     return setup_databases(self.verbosity, self.interactive, **kwargs)
   File "/home/vagrant/deployment/src/django/django/test/runner.py", line
 299, in setup_databases
     serialize=connection.settings_dict.get("TEST_SERIALIZE", True),
   File
 "/home/vagrant/deployment/src/django/django/db/backends/creation.py", line
 373, in create_test_db
     test_database=True,
   File
 "/home/vagrant/deployment/src/django/django/core/management/__init__.py",
 line 115, in call_command
     return klass.execute(*args, **defaults)
   File
 "/home/vagrant/deployment/src/django/django/core/management/base.py", line
 337, in execute
     output = self.handle(*args, **options)
   File
 
"/home/vagrant/deployment/src/django/django/core/management/commands/migrate.py",
 line 146, in handle
     executor.migrate(targets, plan, fake=options.get("fake", False))
   File
 "/home/vagrant/deployment/src/django/django/db/migrations/executor.py",
 line 62, in migrate
     self.apply_migration(migration, fake=fake)
   File
 "/home/vagrant/deployment/src/django/django/db/migrations/executor.py",
 line 96, in apply_migration
     migration.apply(project_state, schema_editor)
   File
 "/home/vagrant/deployment/src/django/django/db/migrations/migration.py",
 line 107, in apply
     operation.database_forwards(self.app_label, schema_editor,
 project_state, new_state)
   File
 
"/home/vagrant/deployment/src/django/django/db/migrations/operations/models.py",
 line 238, in database_forwards
     getattr(new_model._meta, "unique_together", set()),
   File
 "/home/vagrant/deployment/src/django/django/db/backends/sqlite3/schema.py",
 line 169, in alter_unique_together
     self._remake_table(model, override_uniques=new_unique_together)
   File
 "/home/vagrant/deployment/src/django/django/db/backends/sqlite3/schema.py",
 line 126, in _remake_table
     self.execute(sql.replace(temp_model._meta.db_table,
 model._meta.db_table))
   File "/home/vagrant/deployment/src/django/django/db/backends/schema.py",
 line 98, in execute
     cursor.execute(sql, params)
   File "/home/vagrant/deployment/src/django/django/db/backends/utils.py",
 line 65, in execute
     return self.cursor.execute(sql, params)
   File "/home/vagrant/deployment/src/django/django/db/utils.py", line 94,
 in __exit__
     six.reraise(dj_exc_type, dj_exc_value, traceback)
   File "/home/vagrant/deployment/src/django/django/db/backends/utils.py",
 line 65, in execute
     return self.cursor.execute(sql, params)
   File
 "/home/vagrant/deployment/src/django/django/db/backends/sqlite3/base.py",
 line 485, in execute
     return Database.Cursor.execute(self, query, params)
 django.db.utils.OperationalError: index dropbox__dropboxaccount_e8701ad4
 already exists
 }}}

 As far as I can tell, the issue is that Django is creating two
 identically-named indices: one for the ForeignKey and one for the
 unique_together constraint. This issue does not occur if I add
 db_index=False to the ForeignKey or remove the unique_together constraint.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/22844>
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 django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/053.41101447981939ae10ff7d0235a65efe%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to