Django sqlite 到 postgres 数据库迁移

时间:2021-07-12 13:40:53

标签: django postgresql sqlite database-migration

我有一个 750MB 的相当大的数据库,我需要将它从 sqlite 迁移到 postgres。由于数据库很大,我面临着一些以前关于同一主题的问题没有的问题。

几天前,我迁移了一个大小为 30MB 的 sqlite db,loaddatadumpdata 命令没有任何问题。但是对于这个大数据库,我的一个应用程序在运行命令 Database image is malformed 时抛出 dumpdata 错误。我的另一个应用程序成功转储但未加载。我已经看到带有 -v 3 详细标志的对象甚至没有被处理。准确地说,在运行 loaddata 命令时,首先处理来自 json 文件的数据以检查重复的主键和其他模型约束,然后这些数据用于创建模型对象。但是对于这个应用程序,数据并没有首先被处理。

除了这两个命令之外,还有一些其他方法可以进行迁移。但是,模式以我不想做的方式完全改变了。此外,我遇到了问题 DurationField 在迁移后成为字符串,我无法对这些字段进行类型转换。 Bigint 变成 intvarchar 变成 text 等等是一些问题。我不能承受这种问题。

2 个答案:

答案 0 :(得分:2)

我发现了这些问题的问题。

  1. Database image is malformed 发生是因为我直接复制了整个 db 文件。正如 angardi 建议的那样,我使用 gzip 包压缩了 db 文件,然后复制了它。这解决了这个问题。

  2. 有两个问题导致 loaddata 未加载某个应用。该应用程序包含一个模型,该模型具有自身的外键。模型的条目之一将外键设置为条目。这导致了一个无限循环,应用程序没有加载。即使在修复条目后,我也面临同样的问题。发生这种情况是因为我转储了特定应用程序的数据。应用程序模型之一的 ManyToMany 字段设置为另一个应用程序的模型。虽然 loaddata 在未找到 ForeignKey 字段引用时抛出错误,但我认为它一直在搜索 ManyToMany 字段而不会抛出错误,从而变成无限循环类型的情况。在这里,我要做的就是将整个数据库或相关应用程序转储到同一个文件中。

答案 1 :(得分:1)

读取 this 以获取图像格式错误的部分。

从一个数据库迁移到另一个数据库时,您应该首先转储所有数据,然后在新数据库和加载数据上运行 django 迁移。这应该保留所有列类型。

在运行 loaddata 时,应该先加载没有依赖关系的表,然后再加载依赖于那些已经加载的表。