通过让OneToOneField跨越Django中的不同应用程序来重置数据库

时间:2009-07-02 08:28:13

标签: mysql django django-models innodb

运行./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命令的输出是:

(APP1)

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;

1 个答案:

答案 0 :(得分:2)

可以使手动重置更容易的一步是(并避免恐惧ERROR 1217):

SET foreign_key_checks = 0

来自http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

  

InnoDB不允许你删除   由FOREIGN引用的表   KEY约束,除非你做SET   foreign_key_checks = 0.当你放弃   一张桌子,那些约束   在其create语句中定义的是   也掉了下来。