【发布时间】:2021-04-08 13:52:29
【问题描述】:
我正在将应用程序从旧的数据库系统迁移到 django。我已经导入了一堆遗留数据。我使用脚本将旧系统中的表模式转换为 Django 模型,因为它有很多表。然后我使用另一个脚本将旧数据库的内容写入 Django 固定装置,然后我将其导入。一切正常,数据在视图等中提供。
但是,我现在注意到旧系统中的一些 ForeignKey 没有被正确识别为 FK,而是简单地作为 Char/Int 字段放入 djando 模型中。因此,我将一个字段从 IntegerField 更新为 ForeignKey,但作为遗留数据,我遇到了以下问题:
django.db.utils.IntegrityError: The row in table 'pickings_detpick' with primary key '17170' has an invalid foreign key: pickings_detpick.fk_ent_id contains a value '30223' that does not have a corresponding value in pickings_entpick.id.
所以基本上,有许多(不确定有多少)外键引用指向源数据中实际上不存在的对象(无论出于何种原因,我不太了解保持系统)。
有没有一种方法可以简单地告诉 Django 忽略这些并将它们设置为 null 或其他什么?还是我真的必须梳理数据并修复它们?
【问题讨论】:
-
最简单的方法是在数据库中自己使用一些查询(不要使用 Django)。编写一些将执行左/右连接的 SQL,并使用 where 子句选择那些引用对象不存在的行,并根据您的偏好将它们设置为 null / delete。无需手动梳理数据 SQL很强大:)
-
我能做到。如果可能的话,我的偏好仍然是在 django 中执行此操作。我的第二个选择是编写固定装置脚本以找到它们并将它们设置为 null(因为我将在 FK 字段中允许 null=True)。我的最后一个选择是直接在 sql 中进行。 IMO django 是一种 sql/db 抽象。除非绝对必要,否则降到那个级别是没有意义的——就像我不会弄乱 http 协议的内部来编写 Web 服务......
-
是的,ORM 旨在抽象 SQL 操作。但是如果你对 Django 有一定的经验,你就会知道在 Django 中使用 ORM 进行任意连接是不可能的。事实上,这是一个一次性修复,您必须执行编写查询,这不会太难。如果您坚持使用 Django 执行此操作,您将不得不对数据库执行多个查询并自己在 python 中执行连接(最好使用您的脚本选项而不是这个)。与编写简单的查询相比,这非常低效。
-
@AbdulAzizBarkat 是的,我知道有些事情不能用 Django 轻松完成。数据结构并不复杂,所以 FK、mtm 就足够了。我只是不热衷于在侧面提出 sql 查询,因为项目的其他地方不需要它,而且我已经有一个处理相同数据的管道。
标签: django foreign-keys migration