إعادة تعيين قواعد البيانات مع وجود OneToOneField يعبر التطبيقات المختلفة في Django

StackOverflow https://stackoverflow.com/questions/1073162

سؤال

أتلقى الخطأ التالي عندما أقوم بالتشغيل ./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 بإسقاط جدول يتم الإشارة إليه بواسطة قيود مفتاح خارجي ، إلا إذا قمت بتعيين Overide_key_Checks = 0.عند إسقاط جدول ، يتم أيضًا إسقاط القيود التي تم تعريفها في بيانها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top