Opened 6 months ago

Last modified 6 months ago

#27946 new Cleanup/optimization

Improve "ValueError: Found wrong number of constraints" error message

Reported by: Robin Elvin Owned by: nobody
Component: Migrations Version: 1.8
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Robin Elvin)

I had a model which had a unique_together constraint defined. Now I wish to remove this so the unique_together was removed from the model and a migration created. When applying the migration the following error occurred:

  Applying main.0091_auto_20170316_1046...Traceback (most recent call last):
  File "manage.py", line 8, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 222, in handle
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
  File "/usr/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 110, in migrate
    self.apply_migration(states[migration], migration, fake=fake, fake_initial=fake_initial)
  File "/usr/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 148, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/usr/local/lib/python2.7/site-packages/django/db/migrations/migration.py", line 115, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/usr/local/lib/python2.7/site-packages/django/db/migrations/operations/models.py", line 359, in database_forwards
    getattr(new_model._meta, self.option_name, set()),
  File "/usr/local/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 320, in alter_unique_together
    self._delete_composed_index(model, fields, {'unique': True}, self.sql_delete_unique)
  File "/usr/local/lib/python2.7/site-packages/django/db/backends/mysql/schema.py", line 80, in _delete_composed_index
    return super(DatabaseSchemaEditor, self)._delete_composed_index(model, fields, *args)
  File "/usr/local/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 349, in _delete_composed_index
    ", ".join(columns),
ValueError: Found wrong number (0) of constraints for main_projectdrivefile(name, directory_id)

The model's Meta before starting which was subsequently removed prior to creating the migration:

    class Meta:
        unique_together = ('name', 'directory')

The migration created looks like this:

class Migration(migrations.Migration):

    dependencies = [
        ('main', '0090_auto_20170314_1033'),
    ]

    operations = [
        migrations.AlterUniqueTogether(
            name='projectdrivefile',
            unique_together=set([]),
        ),
    ]

Steps to reproduce:

  1. Create a model with a unique_together constraint
  2. Create a migration for this model with makemigrations
  3. Apply migration
  4. Remove unique_together completely
  5. Create a migration for this model with makemigrations
  6. Apply migration

Note: There appears to have been at least 1 report of this bug previously but the reporter could not recreate so the bug was closed.

Change History (4)

comment:1 Changed 6 months ago by Robin Elvin

Description: modified (diff)

comment:2 Changed 6 months ago by Tim Graham

Type: UncategorizedBug

Which database are you using? Can you reproduce the issue with Django's master branch or a version newer than 1.8?

comment:3 Changed 6 months ago by Robin Elvin

This is on MySQL.

In the course of trying to recreate this issue I have discovered that the issue stems from the fact that the table does not have the UNIQUE KEY currently. I am unsure as to how this has happened but this means that the table is not consistent with the migrations. I have manually added the UNIQUE KEY back using ALTER TABLE and successfully applied the migration.

So, I don't know if this is something migrations should handle. Given that the desired state of the model is in effect what it is currently should it just ignore the error? Or perhaps the error message should be more descriptive as this threw me off the scent for quite a while.

comment:4 Changed 6 months ago by Tim Graham

Summary: Removing unique_together creates invalid migrationImprove "ValueError: Found wrong number of constraints" error message
Triage Stage: UnreviewedAccepted
Type: BugCleanup/optimization

Perhaps the error message could be improved. I've seen several tickets reporting this error message as a bug in Django when as you mentioned, it really has to do with the fact that the database is in an unexpected state.

Note: See TracTickets for help on using tickets.
Back to Top