Сброс баз данных с использованием OneToOneField, пересекающего различные приложения в Django
-
21-08-2019 - |
Вопрос
При запуске я получаю следующую ошибку ./manage.py reset app1
:
Error: Error: app1 couldn't be reset. Possible reasons:
* The database isn't running or isn't configured correctly.
* At least one of the database tables doesn't exist.
* The SQL was invalid.
Hint: Look at the output of 'django-admin.py sqlreset app2'. That's the SQL this command wasn't able to run.
The full error: (1217, 'Cannot delete or update a parent row: a foreign key constraint fails')
с моделью, которая имеет OneToOneField, с другой моделью в другом приложении (скажем, app2).Я использую MySQL InnoDB.Более точно, OneToOneField объявлено в модели app2.
Как мне избавиться от этой ошибки?
Обновить: Результатом выполнения команды sqlreset является:
(приложение 1)
BEGIN;
DROP TABLE `app1_instance`;
DROP TABLE `app1_instancegroup`;
CREATE TABLE `app1_instancegroup` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
-- some more fields
)
;
CREATE TABLE `app1_instance` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`belongs_to_id` integer NOT NULL,
-- some more fields
)
;
ALTER TABLE `app1_instance` ADD CONSTRAINT `belongs_to_id_refs_id_455b868f` FOREIGN KEY (`belongs_to_id`) REFERENCES `app1_instancegroup` (`id`);
CREATE INDEX `app1_instance_belongs_to_id` ON `app1_instance` (`belongs_to_id`);
COMMIT;
(приложение 2)
BEGIN;
DROP TABLE `app2_team`;
CREATE TABLE `app2_team` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`instance_group_id` integer NOT NULL UNIQUE,
-- some more fields
)
;
ALTER TABLE `app2_team` ADD CONSTRAINT `instance_group_id_refs_id_39493b52` FOREIGN KEY (`instance_group_id`) REFERENCES `app1_instancegroup` (`id`);
COMMIT;
Решение
Одним из шагов, который может упростить ручной сброс настроек, является (и избежать страшной ОШИБКИ 1217):
SET foreign_key_checks = 0
От http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html:
InnoDB не позволяет вам удалять таблицу, на которую ссылается ограничение ВНЕШНЕГО КЛЮЧА, если только вы не УСТАНОВИТЕ foreign_key_checks = 0.Когда вы удаляете таблицу, ограничения, которые были определены в ее инструкции create, также удаляются.