Opened 6 years ago

Closed 6 years ago

#30381 closed Bug (duplicate)

django/contrib/auth/migrations/0011_update_proxy_permissions.py can cause a unique constraint violation

Reported by: Jon Dufresne Owned by: nobody
Component: contrib.auth Version: 2.2
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Use an existing database that was migrated using Django 2.1. This must contain auth permissions for proxy models. Per Django 2.1, Permission.content_type points to the concrete model's content type, not the proxy's.

Once this database exists, steps to reproduce:

  1. Run a subset of migrations that includes the proxy model's app but does not include 0011_update_proxy_permissions.
  2. This triggers the auth create_permissions() post migrate handler.
  3. create_permissions() generates new permissions for the proxy models that point to the proxy content type. The old ones that point to the concrete model still exist.
  4. Now run all migrations.
  5. auth.0011_update_proxy_permissions runs and tries to update the pre-existing proxy models. But as the auth permissions were already created during the previous migration run, this crashes with a unique constraint violation.

Traceback (PostgreSQL backend):

Traceback (most recent call last):
  ...
  File ".../venv/lib64/python3.7/site-packages/django/core/management/commands/migrate.py", line 234, in handle
    fake_initial=fake_initial,
  File ".../venv/lib64/python3.7/site-packages/django/db/migrations/executor.py", line 117, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File ".../venv/lib64/python3.7/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File ".../venv/lib64/python3.7/site-packages/django/db/migrations/executor.py", line 245, in apply_migration
    state = migration.apply(state, schema_editor)
  File ".../venv/lib64/python3.7/site-packages/django/db/migrations/migration.py", line 124, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File ".../venv/lib64/python3.7/site-packages/django/db/migrations/operations/special.py", line 190, in database_forwards
    self.code(from_state.apps, schema_editor)
  File ".../venv/lib64/python3.7/site-packages/django/contrib/auth/migrations/0011_update_proxy_permissions.py", line 30, in update_proxy_model_permissions
    ).update(content_type=new_content_type)
  File ".../venv/lib64/python3.7/site-packages/django/db/models/query.py", line 741, in update
    rows = query.get_compiler(self.db).execute_sql(CURSOR)
  File ".../venv/lib64/python3.7/site-packages/django/db/models/sql/compiler.py", line 1426, in execute_sql
    cursor = super().execute_sql(result_type)
  File ".../venv/lib64/python3.7/site-packages/django/db/models/sql/compiler.py", line 1097, in execute_sql
    cursor.execute(sql, params)
  File ".../venv/lib64/python3.7/site-packages/django/db/backends/utils.py", line 99, in execute
    return super().execute(sql, params)
  File ".../venv/lib64/python3.7/site-packages/django/db/backends/utils.py", line 67, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File ".../venv/lib64/python3.7/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File ".../venv/lib64/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File ".../venv/lib64/python3.7/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File ".../venv/lib64/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.IntegrityError: duplicate key value violates unique constraint "auth_permission_content_type_id_01ab375a_uniq"
DETAIL:  Key (content_type_id, codename)=(168, add_myproxymodel) already exists.

Change History (1)

comment:1 by Simon Charette, 6 years ago

Resolution: duplicate
Status: newclosed

Duplicate of #30351.

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