Ответ 1
Это будет работать
python manage.py migrate auth
python manage.py migrate
Проблема из-за другой миграции выполняется до авторизации, поэтому это приведет к тому, что миграция "authtools" начнется сначала
Я создаю приложение django с MySQL DB. Когда я запускаю "python manage.py migrate" в первый раз, некоторые таблицы создаются хорошо, тогда появляются некоторые ошибки. Выведенная ошибка:
django.db.utils.IntegrityError: (1215, 'Невозможно добавить внешний ключ ограничение ')
Когда я запускаю эту команду MySQL -
ПОКАЖИТЕ СТАНДАРТ INNODB ДВИГАТЕЛЯ \G,
Я получаю это → >
2015-02-17 14:33:17 7f10891cf700 Error in foreign key constraint of table movie_store/#sql-4f1_66:
FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`):
Cannot resolve table name close to:
(`id`)
Полная трассировка:
Creating tables...
Creating table users
Creating table merchant
Creating table celery_taskmeta
Creating table celery_tasksetmeta
Creating table djcelery_intervalschedule
Creating table djcelery_crontabschedule
Creating table djcelery_periodictasks
Creating table djcelery_periodictask
Creating table djcelery_workerstate
Creating table djcelery_taskstate
Creating table post_office_email
Creating table post_office_log
Creating table post_office_emailtemplate
Creating table post_office_attachment
Running deferred SQL...
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 330, 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 390, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 441, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 173, in handle
created_models = self.sync_apps(connection, executor.loader.unmigrated_apps)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 309, in sync_apps
cursor.execute(statement)
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 80, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 95, 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 63, in execute
return self.cursor.execute(sql)
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/mysql/base.py", line 124, in execute
return self.cursor.execute(query, args)
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')
Это будет работать
python manage.py migrate auth
python manage.py migrate
Проблема из-за другой миграции выполняется до авторизации, поэтому это приведет к тому, что миграция "authtools" начнется сначала
Созданы ли миграции для всех ваших приложений? Если нет, вы можете столкнуться с проблемой, что таблицы базы данных создаются в неправильном порядке, что даст вам эту ошибку.
Если у вас есть существующий проект Django 1.7, вам нужно создать начальные файлы миграции, а затем подделать начальную миграцию, как описано здесь.
https://docs.djangoproject.com/en/1.8/topics/migrations/#adding-migrations-to-apps
Создайте перенос с помощью
$ python manage.py make migrations your_app_label
И затем подделать приложение
$ python manage.py migrate --fake-initial your_app_label
Я встретил эту проблему, пока я использую:
$ python manage.py test
Если вы не выполняли миграцию для тех моделей, у которых есть поле Foreignkey django.contrib.auth.models.User, это приведет к тому, что проблема.
И если вы включили --keepdb
, вы обнаружите, что нет таблицы auth_user
и другой таблицы администратора django.
Проследим всю проблему:
пробег:
$ python manage.py test --verbosity=3
Вы можете увидеть исключение ограничения foreigngkey, возникшее после
Запуск отложенного SQL...
отложенный sql подобен
"ALTER TABLE
xxx
ADD CONSTRAINTxx
ИНОСТРАННЫЙ КЛЮЧ (x
) ССЫЛКИauth_user
"
проверьте исходный код django/core/management/commands/migrate.py:
for statement in deferred_sql:
cursor.execute(statement)
defered_sql
происходит от manifest.items()
для цикла,
и manifest
происходит от all_models
,
и all_models
происходит из app_config.label в app_labels.
это аргумент, переданный
self.sync_apps(connection, executor.loader.unmigrated_apps)
Следовательно, executor.loader.unmigrated_apps
будет содержать ярлык unmigrated_app, и если у вас есть ключ Foreignkey к Django auth_user, это вызовет ошибку ограничения внешней клавиши в то время, нет таблицы с именем auth_user.
решение:
предположим, что app
- это модуль, который содержит классы атрибутов Foreignkey:
$ python manage.py migrate auth
$ python manage.py migrate
$ python manage.py makemigrations app
и если у вас есть другие модули, зависящие от app
, предположим, что таблицы базы данных имеют одинаковое поле с модулем app
, вам нужно:
$ python manage.py make migrate app --fake
У меня была та же проблема с внешним ключом author_id.
Решение заключалось в том, чтобы изменить имя из
author = models.ForeignKey(User, related_name='+')
к
writer = models.ForeignKey(User, related_name='+')
попробуйте изменить свое имя поля на нечто иное, чем
group
Убедитесь, что как внешний ключ, так и первичный ключ имеют тот же тип.
Внешний ключ должен быть того же типа, что и первичный ключ внешней таблицы. У меня был bigint в чужом столе, и django не знал, как автоматически создать внешний ключ, который был автоматически.
Исследуйте, почему миграция завершилась неудачей: python manage.py sqlmraterate {app_name} {mig_name}
Запустите это в рабочем столе, и вы увидите реальную ошибку за неудачей.
django.db.utils.IntegrityError: (1215, "Невозможно добавить ограничение внешнего ключа" )
У меня была такая же ошибка при попытке настроить CI в BitBucket/Pipelines. Проблема заключалась в том, что я не передал папку миграций в наш репозиторий git, так как Pipelines каждый раз восстанавливает все с нуля, тесты модулей не запускались.
Папка миграции создается при выполнении:
python manage.py makemigrations
python manage.py makemigrations <module_name>
Мои тесты будут работать после выполнения шагов makemigrations/migrate и обеспечения того, чтобы наш не-тестовый код работал.
Кажется, что
python manage.py test
попытается сгенерировать миграции, если они в настоящее время не существуют, но не всегда может правильно получить зависимости, поэтому вам необходимо убедиться, что вы скопировали автоматически сгенерированный код в папке миграции в исходный код хранилище.
Подробнее о миграции django можно найти здесь: https://docs.djangoproject.com/en/1.11/topics/migrations/
Если бы та же проблема, оказалось, что каким-то образом Django получил обновление до v1.8
, оперативно понизилось до v1.7
.
Я столкнулся с той же проблемой с версией django 1.8. Я решил проблему, выполнив следующие действия: -
При создании таблиц в первый раз: -
python manage.py migrate auth
python manage.py migrate
Это создаст необходимые таблицы для приложений. Затем выполните следующие действия: -
python manage.py migrate --fake-initial app_name
для всех приложений в проекте.
Это создаст первоначальную миграцию для приложений. Теперь, когда вы запускаете тестовый пример, вы не получите никаких ошибок. Просто запустите
Тест python manage.py
и он должен создавать БД и таблицы каждый раз, когда вы запускаете тесты. --keepdb не требуется.
В Django 1.8 команда syncdb была удалена, вместо syncdb попробуйте выполнить команду manage.py migrate, затем создадут таблицы. после этого вам нужно создать суперпользователя, использующего суперпользователь, или запустить manage.py syncdb, он будет работать.
Если вышеуказанное не работает и вам не нужен Innodb, то по умолчанию используется MYISAM, поскольку он не имеет такого же уровня ссылочной целостности:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'name',
'USER': 'user',
'PASSWORD': 'password',
'OPTIONS': {
"init_command": "SET storage_engine=MYISAM",
}
}
}