Меню

Ошибка отношение уже существует django

I’m trying to set up the tables for a new django project (that is, the tables do NOT already exist in the database); the django version is 1.7 and the db back end is PostgreSQL. The name of the project is crud. Results of migration attempt follow:

python manage.py makemigrations crud

Migrations for 'crud':
  0001_initial.py:
    - Create model AddressPoint
    - Create model CrudPermission
    - Create model CrudUser
    - Create model LDAPGroup
    - Create model LogEntry
    - Add field ldap_groups to cruduser
    - Alter unique_together for crudpermission (1 constraint(s))

python manage.py migrate crud

Operations to perform:
  Apply all migrations: crud
Running migrations:
  Applying crud.0001_initial...Traceback (most recent call last):
  File "manage.py", line 18, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 377, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 338, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 161, in handle
    executor.migrate(targets, plan, fake=options.get("fake", False))
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 68, in migrate
    self.apply_migration(migration, fake=fake)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 102, in apply_migration
    migration.apply(project_state, schema_editor)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/migration.py", line 108, in apply
    operation.database_forwards(self.app_label, schema_editor, project_state, new_state)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/operations/models.py", line 36, in database_forwards
    schema_editor.create_model(model)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/schema.py", line 262, in create_model
    self.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/schema.py", line 103, in execute
    cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 82, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 66, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 66, in execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "crud_crudpermission" already exists

Some highlights from the migration file:

dependencies = [
    ('auth', '0001_initial'),
    ('contenttypes', '0001_initial'),
]
    migrations.CreateModel(
        name='CrudPermission',
        fields=[
            ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
            ('_created_by', models.CharField(default=b'', max_length=64, null=True, editable=False, blank=True)),
            ('_last_updated_by', models.CharField(default=b'', max_length=64, null=True, editable=False, blank=True)),
            ('_created', models.DateTimeField(null=True, editable=False, blank=True)),
            ('_last_updated', models.DateTimeField(null=True, editable=False, blank=True)),
            ('domain', models.CharField(max_length=32, choices=[(b'town', b'Town'), (b'boe', b'BOE'), (b'police', b'Police')])),
            ('ldap_group', models.CharField(max_length=128, verbose_name=b'LDAP group')),
            ('can_add', models.BooleanField(default=False, verbose_name=b'add')),
            ('can_change', models.BooleanField(default=False, verbose_name=b'change')),
            ('restrict_change_to_own', models.BooleanField(default=False)),
            ('can_delete', models.BooleanField(default=False, verbose_name=b'delete')),
            ('restrict_delete_to_own', models.BooleanField(default=False)),
            ('models', models.ManyToManyField(to='contenttypes.ContentType', null=True, blank=True)),
        ],
        options={
            'verbose_name': 'CRUD permission',
        },
        bases=(models.Model,),
    ),
    migrations.AlterUniqueTogether(
        name='crudpermission',
        unique_together=set([('ldap_group', 'can_add', 'can_change', 'can_delete', 'domain')]),
    )

,

The crud app is not meant to actually do anything, but I use it another app, so when I try migrate from that app, I trigger the above problem.

I’ve found other examples on the web of people with similar issues, but none of their cases seem to apply because

  1. The problem affects an entire relation, not just one column
  2. I am not using multiple inheritance.

Where should I look next to find the underlying problem?

I recently checked out the master branch of a project, and there were model changes not yet reflected in a migration:

(venv) Kurts-MacBook-Pro-2:lucy-web kurtpeek$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auditlog, auth, contenttypes, lucy_web, oauth2_provider, otp_static, otp_totp, sessions, two_factor
Running migrations:
  No migrations to apply.
  Your models have changes that are not yet reflected in a migration, and so won't be applied.
  Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.

Following the instructions, I ran makemigrations to create them:

(venv) Kurts-MacBook-Pro-2:lucy-web kurtpeek$ python manage.py makemigrations
Migrations for 'auth':
  venv/lib/python3.6/site-packages/django/contrib/auth/migrations/0009_auto_20180425_1129.py
    - Alter field email on user
Migrations for 'lucy_web':
  lucy_web/migrations/0146_auto_20180425_1129.py
    - Alter field description on sessiontype
    - Alter field short_description on sessiontype

Interestingly, the 0009_auto_20180425_1129.py migration was created in the venv containing Django’s source code (version 1.11.9), which I don’t believe anyone on our team changed. Here is this migration:

# -*- coding: utf-8 -*-
# Generated by Django 1.11.9 on 2018-04-25 18:29
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('auth', '0008_alter_user_username_max_length'),
    ]

    operations = [
        migrations.AlterField(
            model_name='user',
            name='email',
            field=models.EmailField(blank=True, max_length=254, unique=True, verbose_name='email address'),
        ),
    ]

It seems ‘innocent enough’, but when I try to migrate, I get the following ProgrammingError:

(venv) Kurts-MacBook-Pro-2:lucy-web kurtpeek$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auditlog, auth, contenttypes, lucy_web, oauth2_provider, otp_static, otp_totp, sessions, two_factor
Running migrations:
  Applying auth.0009_auto_20180425_1129...Traceback (most recent call last):
  File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
psycopg2.ProgrammingError: relation "auth_user_email_1c89df09_uniq" already exists

Some of the answers at django.db.utils.ProgrammingError: relation already exists seem to be pretty drastic, like deleting all migrations or using the command option --fake, without providing an explanation of what fundamentally is causing the error.

Any idea how to address this error?

I recently checked out the master branch of a project, and there were model changes not yet reflected in a migration:

(venv) Kurts-MacBook-Pro-2:lucy-web kurtpeek$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auditlog, auth, contenttypes, lucy_web, oauth2_provider, otp_static, otp_totp, sessions, two_factor
Running migrations:
  No migrations to apply.
  Your models have changes that are not yet reflected in a migration, and so won't be applied.
  Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.

Following the instructions, I ran makemigrations to create them:

(venv) Kurts-MacBook-Pro-2:lucy-web kurtpeek$ python manage.py makemigrations
Migrations for 'auth':
  venv/lib/python3.6/site-packages/django/contrib/auth/migrations/0009_auto_20180425_1129.py
    - Alter field email on user
Migrations for 'lucy_web':
  lucy_web/migrations/0146_auto_20180425_1129.py
    - Alter field description on sessiontype
    - Alter field short_description on sessiontype

Interestingly, the 0009_auto_20180425_1129.py migration was created in the venv containing Django’s source code (version 1.11.9), which I don’t believe anyone on our team changed. Here is this migration:

# -*- coding: utf-8 -*-
# Generated by Django 1.11.9 on 2018-04-25 18:29
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('auth', '0008_alter_user_username_max_length'),
    ]

    operations = [
        migrations.AlterField(
            model_name='user',
            name='email',
            field=models.EmailField(blank=True, max_length=254, unique=True, verbose_name='email address'),
        ),
    ]

It seems ‘innocent enough’, but when I try to migrate, I get the following ProgrammingError:

(venv) Kurts-MacBook-Pro-2:lucy-web kurtpeek$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auditlog, auth, contenttypes, lucy_web, oauth2_provider, otp_static, otp_totp, sessions, two_factor
Running migrations:
  Applying auth.0009_auto_20180425_1129...Traceback (most recent call last):
  File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
psycopg2.ProgrammingError: relation "auth_user_email_1c89df09_uniq" already exists

Some of the answers at django.db.utils.ProgrammingError: relation already exists seem to be pretty drastic, like deleting all migrations or using the command option --fake, without providing an explanation of what fundamentally is causing the error.

Any idea how to address this error?

Я пытаюсь настроить таблицы для нового проекта django (то есть таблицы НЕ уже существуют в базе данных); версия django — 1.7, а конец db — PostgreSQL. Название проекта красное. Результаты попытки миграции:

python manage.py makemigrations crud

Migrations for 'crud':
  0001_initial.py:
    - Create model AddressPoint
    - Create model CrudPermission
    - Create model CrudUser
    - Create model LDAPGroup
    - Create model LogEntry
    - Add field ldap_groups to cruduser
    - Alter unique_together for crudpermission (1 constraint(s))

python manage.py migrate crud

Operations to perform:
  Apply all migrations: crud
Running migrations:
  Applying crud.0001_initial...Traceback (most recent call last):
  File "manage.py", line 18, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 377, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 338, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 161, in handle
    executor.migrate(targets, plan, fake=options.get("fake", False))
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 68, in migrate
    self.apply_migration(migration, fake=fake)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 102, in apply_migration
    migration.apply(project_state, schema_editor)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/migration.py", line 108, in apply
    operation.database_forwards(self.app_label, schema_editor, project_state, new_state)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/operations/models.py", line 36, in database_forwards
    schema_editor.create_model(model)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/schema.py", line 262, in create_model
    self.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/schema.py", line 103, in execute
    cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 82, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 66, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 66, in execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "crud_crudpermission" already exists

Некоторые основные моменты из файла миграции:

dependencies = [
    ('auth', '0001_initial'),
    ('contenttypes', '0001_initial'),
]
    migrations.CreateModel(
        name='CrudPermission',
        fields=[
            ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
            ('_created_by', models.CharField(default=b'', max_length=64, null=True, editable=False, blank=True)),
            ('_last_updated_by', models.CharField(default=b'', max_length=64, null=True, editable=False, blank=True)),
            ('_created', models.DateTimeField(null=True, editable=False, blank=True)),
            ('_last_updated', models.DateTimeField(null=True, editable=False, blank=True)),
            ('domain', models.CharField(max_length=32, choices=[(b'town', b'Town'), (b'boe', b'BOE'), (b'police', b'Police')])),
            ('ldap_group', models.CharField(max_length=128, verbose_name=b'LDAP group')),
            ('can_add', models.BooleanField(default=False, verbose_name=b'add')),
            ('can_change', models.BooleanField(default=False, verbose_name=b'change')),
            ('restrict_change_to_own', models.BooleanField(default=False)),
            ('can_delete', models.BooleanField(default=False, verbose_name=b'delete')),
            ('restrict_delete_to_own', models.BooleanField(default=False)),
            ('models', models.ManyToManyField(to='contenttypes.ContentType', null=True, blank=True)),
        ],
        options={
            'verbose_name': 'CRUD permission',
        },
        bases=(models.Model,),
    ),
    migrations.AlterUniqueTogether(
        name='crudpermission',
        unique_together=set([('ldap_group', 'can_add', 'can_change', 'can_delete', 'domain')]),
    )

Приложение crud не предназначено, чтобы на самом деле ничего делать, но я использую его в другом приложении, поэтому, когда я пытаюсь выполнить миграцию из этого приложения, я запускаю вышеупомянутую проблему.

Я нашел другие примеры в Интернете людей с подобными проблемами, но ни один из их случаев не применяется, потому что

  • Проблема затрагивает целое отношение, а не только один столбец
  • Я не использую множественное наследование.

Где я должен искать, чтобы найти основную проблему?

Я пытаюсь настроить таблицы для нового проекта django (то есть таблицы НЕ уже существуют в базе данных); версия django — 1.7, а конец db — PostgreSQL. Название проекта красное. Результаты попытки миграции:

python manage.py makemigrations crud

Migrations for 'crud':
  0001_initial.py:
    - Create model AddressPoint
    - Create model CrudPermission
    - Create model CrudUser
    - Create model LDAPGroup
    - Create model LogEntry
    - Add field ldap_groups to cruduser
    - Alter unique_together for crudpermission (1 constraint(s))

python manage.py migrate crud

Operations to perform:
  Apply all migrations: crud
Running migrations:
  Applying crud.0001_initial...Traceback (most recent call last):
  File "manage.py", line 18, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 377, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 338, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 161, in handle
    executor.migrate(targets, plan, fake=options.get("fake", False))
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 68, in migrate
    self.apply_migration(migration, fake=fake)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 102, in apply_migration
    migration.apply(project_state, schema_editor)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/migration.py", line 108, in apply
    operation.database_forwards(self.app_label, schema_editor, project_state, new_state)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/operations/models.py", line 36, in database_forwards
    schema_editor.create_model(model)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/schema.py", line 262, in create_model
    self.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/schema.py", line 103, in execute
    cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 82, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 66, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 66, in execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "crud_crudpermission" already exists

Некоторые основные моменты из файла миграции:

dependencies = [
    ('auth', '0001_initial'),
    ('contenttypes', '0001_initial'),
]
    migrations.CreateModel(
        name='CrudPermission',
        fields=[
            ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
            ('_created_by', models.CharField(default=b'', max_length=64, null=True, editable=False, blank=True)),
            ('_last_updated_by', models.CharField(default=b'', max_length=64, null=True, editable=False, blank=True)),
            ('_created', models.DateTimeField(null=True, editable=False, blank=True)),
            ('_last_updated', models.DateTimeField(null=True, editable=False, blank=True)),
            ('domain', models.CharField(max_length=32, choices=[(b'town', b'Town'), (b'boe', b'BOE'), (b'police', b'Police')])),
            ('ldap_group', models.CharField(max_length=128, verbose_name=b'LDAP group')),
            ('can_add', models.BooleanField(default=False, verbose_name=b'add')),
            ('can_change', models.BooleanField(default=False, verbose_name=b'change')),
            ('restrict_change_to_own', models.BooleanField(default=False)),
            ('can_delete', models.BooleanField(default=False, verbose_name=b'delete')),
            ('restrict_delete_to_own', models.BooleanField(default=False)),
            ('models', models.ManyToManyField(to='contenttypes.ContentType', null=True, blank=True)),
        ],
        options={
            'verbose_name': 'CRUD permission',
        },
        bases=(models.Model,),
    ),
    migrations.AlterUniqueTogether(
        name='crudpermission',
        unique_together=set([('ldap_group', 'can_add', 'can_change', 'can_delete', 'domain')]),
    )

Приложение crud не предназначено, чтобы на самом деле ничего делать, но я использую его в другом приложении, поэтому, когда я пытаюсь выполнить миграцию из этого приложения, я запускаю вышеупомянутую проблему.

Я нашел другие примеры в Интернете людей с подобными проблемами, но ни один из их случаев не применяется, потому что

  • Проблема затрагивает целое отношение, а не только один столбец
  • Я не использую множественное наследование.

Где я должен искать, чтобы найти основную проблему?

4b9b3361

Ответ 1

Это работает довольно хорошо

./manage.py migrate --fake default

Источник: — https://github.com/nijel/weblate/issues/587

Ответ 2

Сделайте ли python manage.py migrate --fake.

Прочитайте https://docs.djangoproject.com/en/1.9/ref/django-admin/#django-admin-migrate.

Ответ 3

У вас возникла аналогичная проблема, в конечном итоге удаленные все .py файлы в папке миграции (django 1.7 создает один автоматически), после этого отлично сработал.

Ответ 4

Я столкнулся с подобной проблемой, когда добавил пару новых полей в существующую модель. Я использую Django 1.9, который представил --run-syncdb. Запуск manage.py migrate --run-syncdb исправил мои таблицы.

Ответ 5

Я столкнулся с аналогичными проблемами, когда я изменил имя столбца. Я получал ту же ошибку, что упоминался в трассировке стека, заданной с его вопросом.

Вот что я сделал.

Сначала я запускал поддельные миграции. Затем я удалил запись (миграции, которую я хотел запустить) из таблицы django_migrations и снова выполнил миграцию (на этот раз не подделка).

Изменения появились как ожидалось для меня.

надеюсь, что это будет полезно.

Ответ 6

Теперь (я использую Django 1.9) вы можете сделать:

./manage.py [—database DATABASE] —fake [app_label] [имя_переменной]

Таким образом, вы ориентируетесь на проблему с большей точностью, и вы можете подделать только проблемную миграцию в конкретной базе данных.

Итак, глядя на вопрос, вы могли:

./manage.py —database default —fake crud crud.0001_initial

Ответ 7

Django предоставляет --fake-initial которую я нашел эффективной для моего использования. Из миграционной документации Django:

—fake-начальная

Позволяет Django пропускать начальную миграцию приложений, если все таблицы базы данных с именами всех моделей, созданных всеми операциями CreateModel в этой миграции, уже существуют. Этот параметр предназначен для использования при первом запуске миграций для базы данных, в которой ранее использовались миграции. Однако этот параметр не проверяет соответствие схемы базы данных за пределами совпадающих имен таблиц, поэтому его можно использовать только в том случае, если вы уверены, что ваша существующая схема совпадает с записанной при первоначальной миграции.

Для моего использования я только что вытащил проект из системы управления версиями и готовился добавить несколько новых полей модели. Я добавил поля, запустил ./manage.py makemigrations и затем попытался запустить ./manage.py migrate что ./manage.py migrate ошибку, поскольку, как и следовало ожидать, многие поля уже существовали в существующей базе данных.

То, что я должен был сделать, — это запустить makemigrations сразу после makemigrations проекта из управления версиями, чтобы создать снимок состояния существующих моделей. Затем следующим шагом будет запуск ./manage.py migrate --fake-initial.

После этого вы можете добавить и makemigrations migrate > migrate как обычно.

ПРИМЕЧАНИЕ: я не знаю, пропустит ли --fake-initial существующие поля и добавит ли новые. Я решил закомментировать новые поля, которые я создал до этого момента, запустить --fake-initial как будто это было первое, что я сделал после извлечения из системы управления версиями, а затем добавил в обновленные поля в следующей миграции.

Другая связанная с этим документация: https://docs.djangoproject.com/en/dev/topics/migrations/#initial-migrations

Ответ 8

Я нашел и решил конкретный пример этой ошибки в проекте Django 1.10, когда я менял поле внешнего ключа с именем member, чтобы указать на другую таблицу. Я менял это в трех разных моделях, и я ударил эту ошибку на всех из них. В моей первой попытке я переименовал member в member_user и попытался создать новое поле member в качестве внешнего ключа, указывающего на новую таблицу, но это не сработало.

Я обнаружил, что когда я переименовал столбец member, он не изменил имя индекса в форме <app>_<model>_<hash>, и когда я попытался создать новый столбец member, он попытался создать такое же имя индекса, хэш-часть имени была одинаковой.

Я решил проблему, создав новое отношение member_user временно и скопировав данные. Это создало новый индекс с другим хэшем. Затем я удалил member и воссоздал его, указав на новую таблицу, и с этим будущим конфликтующим именем индекса. Как только это было сделано, я выполнил шаг RunPython, чтобы заполнить новый столбец member ссылкой на соответствующую таблицу. Я закончил, добавив миграции RemoveField, чтобы очистить временные столбцы member_user.

Мне пришлось разделить мои миграции на два файла, потому что я получил эту ошибку:

psycopg2.OperationalError: не может ALTER TABLE «<table_name > » потому что он имеет ожидающие события запуска

После создания и копирования данных в member_user мне не удалось удалить member в той же транзакции миграции. Это может быть специфическим ограничением postgres, но его легко решить, создав еще одну транзакцию и перемещая все после создания и копирования member_user во вторую миграцию.

Ответ 9

Я нашел эту проблему в web2pyframework в models/config.py.

+ Изменить

settings.base.migrate = True

в конфигурационном файле

settings.base.migrate = False

Задача решена.

Предыстория: после добавления djangoratings в мой проект я попытался запустить

django-admin.py schemamigration djangoratings --initial 
--settings=myapp.settings.local 

что привело к неизвестной ошибке команды для миграции схемы. Я попытался устранить эту ошибку, добавив каталог моего проекта в PYTHONPATH (я использую virtualenv и virtualenvwrapper). Это устранило неизвестную ошибку команды для миграции схемы, но я думаю, что указал один каталог над каталогом моего проекта для PYTHONPATH, и когда первоначальная миграция была запущена для djangoratings, он жаловался на что-то, связанное с whoosh (который я использую в своем проекте) . Я изменил каталог PYTHONPATH и попытался запустить

django-admin.py schemamigration djangoratings --initial 
--settings=myapp.settings.local

опять таки. Затем я запустил команду миграции. Это когда я получил ошибку:

django.db.utils.DatabaseError: relation "djangoratings_vote" already exists

Я попытался выполнить миграцию полностью, используя:

django-admin.py migrate djangoratings zero --settings=myapp.settings.local
Running migrations for djangoratings:
- Migrating backwards to zero state.
< djangoratings:0006_add_cookies
< djangoratings:0005_add_exclusions
< djangoratings:0004_rethink_recommendations
< djangoratings:0003_add_correlations
< djangoratings:0002_add_mean_and_stddev
< djangoratings:0001_initial

а затем снова запустил —initial, но та же ошибка возникла после выполнения команды migrate.

Я просмотрел список таблиц в своей базе данных и не нашел ни одной для djangoratings_vote.

Мой текущий список миграций для djangoratings выглядит следующим образом:

0001_initial.py                   0006_add_cookies.py
0001_initial.pyc                  0006_add_cookies.pyc
0002_add_mean_and_stddev.py       0007_initial.py
0002_add_mean_and_stddev.pyc      0007_initial.pyc
0003_add_correlations.py          0008_initial.py
0003_add_correlations.pyc         0008_initial.pyc
0004_rethink_recommendations.py   0009_initial.py
0004_rethink_recommendations.pyc  0009_initial.pyc
0005_add_exclusions.py            __init__.py
0005_add_exclusions.pyc           __init__.pyc

Как я могу устранить ошибку отношения «djangoratings_vote» уже существует? Предпочтительно использовать Юг?

Я пытаюсь настроить таблицы для нового проекта django (то есть таблицы еще НЕ существуют в базе данных); версия django — 1.7, а серверная часть базы данных — PostgreSQL. Название проекта кривое. Ниже приведены результаты попытки миграции:

python manage.py makemigrations crud

Migrations for 'crud':
  0001_initial.py:
    - Create model AddressPoint
    - Create model CrudPermission
    - Create model CrudUser
    - Create model LDAPGroup
    - Create model LogEntry
    - Add field ldap_groups to cruduser
    - Alter unique_together for crudpermission (1 constraint(s))

python manage.py migrate crud

Operations to perform:
  Apply all migrations: crud
Running migrations:
  Applying crud.0001_initial...Traceback (most recent call last):
  File "manage.py", line 18, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 377, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 338, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 161, in handle
    executor.migrate(targets, plan, fake=options.get("fake", False))
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 68, in migrate
    self.apply_migration(migration, fake=fake)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 102, in apply_migration
    migration.apply(project_state, schema_editor)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/migration.py", line 108, in apply
    operation.database_forwards(self.app_label, schema_editor, project_state, new_state)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/operations/models.py", line 36, in database_forwards
    schema_editor.create_model(model)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/schema.py", line 262, in create_model
    self.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/schema.py", line 103, in execute
    cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 82, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 66, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 66, in execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "crud_crudpermission" already exists

Некоторые основные моменты из файла миграции:

dependencies = [
    ('auth', '0001_initial'),
    ('contenttypes', '0001_initial'),
]
    migrations.CreateModel(
        name='CrudPermission',
        fields=[
            ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
            ('_created_by', models.CharField(default=b'', max_length=64, null=True, editable=False, blank=True)),
            ('_last_updated_by', models.CharField(default=b'', max_length=64, null=True, editable=False, blank=True)),
            ('_created', models.DateTimeField(null=True, editable=False, blank=True)),
            ('_last_updated', models.DateTimeField(null=True, editable=False, blank=True)),
            ('domain', models.CharField(max_length=32, choices=[(b'town', b'Town'), (b'boe', b'BOE'), (b'police', b'Police')])),
            ('ldap_group', models.CharField(max_length=128, verbose_name=b'LDAP group')),
            ('can_add', models.BooleanField(default=False, verbose_name=b'add')),
            ('can_change', models.BooleanField(default=False, verbose_name=b'change')),
            ('restrict_change_to_own', models.BooleanField(default=False)),
            ('can_delete', models.BooleanField(default=False, verbose_name=b'delete')),
            ('restrict_delete_to_own', models.BooleanField(default=False)),
            ('models', models.ManyToManyField(to='contenttypes.ContentType', null=True, blank=True)),
        ],
        options={
            'verbose_name': 'CRUD permission',
        },
        bases=(models.Model,),
    ),
    migrations.AlterUniqueTogether(
        name='crudpermission',
        unique_together=set([('ldap_group', 'can_add', 'can_change', 'can_delete', 'domain')]),
    )

,

Это грубое приложение на самом деле не предназначено для каких-либо действий, но я использую его в другом приложении, поэтому, когда я пытаюсь выполнить миграцию из этого приложения, у меня возникает описанная выше проблема.

Я нашел в Интернете другие примеры людей с похожими проблемами, но ни один из них не подходит, потому что

  1. Проблема затрагивает все отношение, а не только один столбец
  2. Я не использую множественное наследование.

Где я должен искать дальше, чтобы найти основную проблему?

17 ответов

Я столкнулся с аналогичной проблемой, когда добавил пару новых полей в существующую модель. Я использую Django 1.9, который представлен вариант --run-syncdb. Запуск manage.py migrate --run-syncdb исправил мои таблицы.


15

roboslone
27 Июл 2016 в 17:29

Теперь (я использую Django 1.9) вы можете сделать:

./manage.py migrate [--database DATABASE] --fake [app_label] [migration_name]

Таким образом, вы более точно нацелитесь на проблему и сможете подделать только проблемную миграцию в конкретной базе данных.

Итак, глядя на вопрос, вы могли бы:

./manage.py migrate --database default --fake crud crud.0001_initial


10

StephenGodderidge
23 Май 2021 в 08:40

Столкнулся с аналогичной проблемой, в конце концов удалил все файлы .py в папке миграции (django 1.7 создает их автоматически), после этого отлично работал.


8

Rickka
25 Июн 2015 в 08:59

Я столкнулся с аналогичными проблемами, когда я изменил имя столбца. Я получал ту же ошибку, что и в трассировке стека, предоставленной с вопросом.

Вот что я сделал.

Сначала я запустил поддельные миграции. Затем я удалил запись (миграции, которые я хотел запустить) из таблицы django_migrations и снова запустил миграцию (на этот раз без подделки).

Изменения появились, как и ожидалось для меня.

Надеюсь, что это полезно.


6

Vishal Mopari
25 Май 2017 в 11:56

Django предоставляет опцию --fake-initial, которую я нашел эффективной для себя. Из Документация по миграции Django :

—fake — начальная

Позволяет Django пропустить начальную миграцию приложения, если все таблицы базы данных с именами всех моделей, созданных всеми операциями CreateModel в этой миграции, уже существуют. Этот параметр предназначен для использования при первом запуске миграции для базы данных, которая ранее использовала миграции. Однако этот параметр не проверяет соответствие схемы базы данных, кроме соответствия именам таблиц, поэтому его можно безопасно использовать только в том случае, если вы уверены, что ваша существующая схема совпадает с записью при первоначальной миграции.

Для себя я только что вытащил проект из системы контроля версий и готовился добавить несколько новых полей модели. Я добавил поля, запустил ./manage.py makemigrations, а затем попытался запустить ./manage.py migrate, что выдало ошибку, поскольку, как и следовало ожидать, многие поля уже существовали в существующей базе данных.

Что мне нужно было сделать, так это запустить makemigrations сразу после извлечения проекта из системы управления версиями, чтобы создать моментальный снимок состояния существующих моделей. Затем запуск ./manage.py migrate --fake-initial будет следующим шагом.

После этого вы можете складывать и makemigrations > migrate как обычно.

ПРИМЕЧАНИЕ. Я не знаю, будет ли --fake-initial пропускать существующие поля и добавлять новые. Я решил закомментировать новые поля, которые я создал до этого момента, запустить --fake-initial, как если бы это было первое, что я сделал после извлечения из системы управления версиями, затем добавил в обновленные поля в следующей миграции.

Другая связанная документация: https://docs.djangoproject.com/en /dev/topics/migrations/#initial-migrations


5

alexandernst
22 Июн 2019 в 18:00

Я занимаюсь этим уже несколько лет. Возможны разные сценарии:

Сценарий 1: как и в исходном сообщении, у вас не было таблиц для начала. В этом случае я бы

  1. закомментируйте отношения в models.py
  2. запустить python manage.py
  3. мигрировать, предполагая, что теперь это удается
  4. раскомментируй то, что ты
  5. прокомментировано на шаге 1, запустите python manage.py migrate —fake

Сценарий 2: несколько приложений: Одна из возможностей заключается в том, что у вас могут быть разные приложения, а модель данных одного приложения использует некоторые таблицы из другого приложения. В этом случае, если модель данных разработана правильно, вы сможете создать таблицы только для одного приложения (указав только его в settings.py), затем добавить другое приложение и выполнить миграцию. Если это не продуманный дизайн и есть рекурсивные зависимости, я предлагаю изменить дизайн, а не делать временное исправление.

Сценарий 3: у вас было несколько таблиц, и что-то пошло не так с миграцией, тогда я бы

  1. вернуть models.py к тому, что было, и ввести только новые отношения, которые, по-видимому, уже существуют в models.py.
  2. удалить папку миграции
  3. запустить python manage.py makemigrations
  4. внесите новые изменения в models.py, если таковые имеются, и продолжите выполнение команд makemigrations и migrate, как обычно.


4

max
26 Ноя 2019 в 20:17

Я нашел эту проблему в web2pyframework в models/config.py .

+ Изменить

settings.base.migrate = True

В конфигурационном файле для

settings.base.migrate = False

Задача решена.


2

4b0
26 Июн 2018 в 10:06

Я не уверен в использовании решения с подделкой. Скорее всего, эта ошибка повторится при следующей миграции.

Узнайте, какие столбцы создают эту проблему

  1. python manage.py dbshell
  2. select * from <tablename> where false; (Теперь вы видите, какие столбцы сохранены postgresql и можете удалить их в базе данных)
  3. alter table <tablename> drop column <columnname>; (Запустите процесс миграции)
  4. python manage.py makemigrations
  5. python manage.py migrate


1

Grigorij Abramov
31 Янв 2022 в 23:02

Если вы получаете эту ошибку при запуске python manage.py test --k, вы можете исправить ее, удалив тестовую базу данных: python manage.py test


1

Chris
29 Мар 2022 в 05:47

У меня такая же проблема. ./manage.py migrate --fake не подходит, особенно если это ваш первый коммит. Когда вы запускаете ./manage.py makemigrations, он собирает файл миграции, и если это первое упоминание вашей модели в коде, то django попытается создать такую ​​таблицу в БД. Чтобы вылечить его, следует:

  1. Удалите операции migrations.CreateModel из файла миграции.
  2. Запустите ./manage.py migrate в консоли
  3. Ctrl+z ваши изменения в файле миграции


1

ilya_kas
8 Июн 2022 в 12:49

Что касается меня, когда я столкнулся с этим исключением, я решил его с помощью утилиты Django dbshell или любого вида MY_DATABASE Viewer / интерактивной командной строки.

DBShell:

  1. python manage.py dbshell
  2. ALTER TABLE [name_of_field_that_already_exists] DROP column [field_table];


3

Mahrez BenHamad
6 Окт 2021 в 13:03

Не пытайтесь использовать --fake, так как этим вы рискуете повредить базу данных.

Вместо этого вы можете сделать резервную копию текущей базы данных, создать ее заново, а затем применить резервную копию.

  1. Создать резервную копию: pg_dump -F c -v -h localhost <database_name> -f tmp/<pick_a_file_name>.psql

  2. Воссоздайте это: rails db:drop db:create

  3. Восстановить резервную копию: pg_restore --exit-on-error --verbose --dbname=<database_name> tmp/<pick_a_file_name>.psql


-1

Matej J
5 Окт 2020 в 22:28

Недавно у меня была такая же проблема, и я попробовал некоторые решения здесь. manage.py migrate --fake привело к ошибке "django_content_type" does not exist. Точно так же удаление старых миграций может вызвать проблемы для других пользователей, если миграции являются общими.

Команда manage.py squashmigrations (документы) выглядит быть идеальным способом справиться с этим. Объединяет старые миграции в одну миграцию (что предотвращает их применение вне очереди и т. д.) и сохраняет старые миграции для любых других пользователей. По крайней мере, в моем случае это сработало.


2

camrobjones
14 Сен 2020 в 10:00

В моем случае файл миграции был удален и автоматически сгенерирован новый с другим именем. Из-за разницы в имени Django попытался применить новый файл миграции, который был точно таким же, как ранее примененный, который теперь был удален. В обоих из них необходимо было создать новую модель, что привело к django.db.utils.ProgrammingError: relation "app_space" already exists. Я попытался отменить миграцию, но отсутствующий файл миграции не позволил django отменить ее. Урок извлечен, файлы миграции должны быть проверены в git.

Вот несколько шагов, которые помогли мне разобраться в этом. --fake решил ее временно, но та же проблема возникла при следующей миграции. Я бы не рекомендовал --fake, если вы не уверены, что это правильный вариант использования.

Этот ответ был для меня действительно ключевым.

  1. Проверьте предыдущие миграции python manage.py showmigrations

  2. Проверьте примененные миграции в Django DB select * from django_migrations; (используйте psql для доступа к консоли базы данных postgres: psql -h 0.0.0.0 -U <your-db-user>, затем используйте целевую базу данных c <your-db-name>).

  3. Я увидел примененную миграцию, которой больше нет в моей папке миграции.

 20 | app             | 0001_initial                             | 2021-03-05 07:40:20.14602+00
 21 | app             | 0002_some_auto_name                      | 07:40:20.269775+00
 22 | app             | 0003_auto_20210318_2350 <---here         | 2021-03-18 23:50:09.064971+00

Но в папке миграции у меня было 0003_auto_20210318_2355, тот же файл был создан через 5 минут. Я переименовал файл миграции в имя выше, чтобы я мог отменить его.

  1. Отмените миграцию, передав миграцию, к которой вы хотите вернуться.

python manage.py migrate <app-name> <latest-migration-to-which-to-return>

python manage.py migrate app 0002_some_auto_name

  1. Поступайте правильно и проверьте миграцию в git. Тогда вы можете делать makemigrations и migrate и вести более спокойную жизнь.


4

Semih Sezer
21 Мар 2021 в 10:12

Я нашел и решил конкретный пример этой ошибки в проекте Django 1.10, когда я изменял поле внешнего ключа с именем member, чтобы оно указывало на другую таблицу. Я менял это в трех разных моделях, и я столкнулся с этой ошибкой на всех из них. В моей первой попытке я переименовал member в member_user и попытался создать новое поле member в качестве внешнего ключа, указывающего на новую таблицу, но это не сработало.

Я обнаружил, что когда я переименовал столбец member, он не изменил имя индекса в форме <app>_<model>_<hash>, а когда я попытался создать новый столбец member, он попытался создать то же самое. имя индекса, потому что хэш-часть имени была такой же.

Я решил проблему, временно создав новое отношение member_user и скопировав данные. Это создало новый индекс с другим хешем. Затем я удалил member и воссоздал его, указав на новую таблицу, а вместе с ней и на предполагаемое конфликтующее имя индекса. Как только это было сделано, я выполнил шаг RunPython, чтобы заполнить новый столбец member ссылками на соответствующую таблицу. В завершение я добавил миграции RemoveField для очистки временных столбцов member_user.

Мне пришлось разделить мои миграции на два файла, потому что я получил эту ошибку:

psycopg2.OperationalError: невозможно ИЗМЕНИТЬ ТАБЛИЦУ «», так как у нее есть ожидающие события триггера

После создания и копирования данных в member_user мне не удалось удалить member в той же транзакции переноса. Это может быть специфическим ограничением postgres, но его легко устранить, создав другую транзакцию и переместив все после создания и копирования member_user во вторую миграцию.


3

Shaun Kruger
17 Апр 2017 в 18:39

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка отношение users не существует
  • Ошибка относительного показателя формула