我有一个 750MB 的相当大的数据库,我需要将它从 sqlite
迁移到 postgres
。由于数据库很大,我面临着一些以前关于同一主题的问题没有的问题。
几天前,我迁移了一个大小为 30MB 的 sqlite
db,loaddata
和 dumpdata
命令没有任何问题。但是对于这个大数据库,我的一个应用程序在运行命令 Database image is malformed
时抛出 dumpdata
错误。我的另一个应用程序成功转储但未加载。我已经看到带有 -v 3
详细标志的对象甚至没有被处理。准确地说,在运行 loaddata
命令时,首先处理来自 json 文件的数据以检查重复的主键和其他模型约束,然后这些数据用于创建模型对象。但是对于这个应用程序,数据并没有首先被处理。
除了这两个命令之外,还有一些其他方法可以进行迁移。但是,模式以我不想做的方式完全改变了。此外,我遇到了问题 DurationField
在迁移后成为字符串,我无法对这些字段进行类型转换。 Bigint
变成 int
和 varchar
变成 text
等等是一些问题。我不能承受这种问题。
答案 0 :(得分:2)
我发现了这些问题的问题。
Database image is malformed
发生是因为我直接复制了整个 db 文件。正如 angardi 建议的那样,我使用 gzip 包压缩了 db 文件,然后复制了它。这解决了这个问题。
有两个问题导致 loaddata
未加载某个应用。该应用程序包含一个模型,该模型具有自身的外键。模型的条目之一将外键设置为条目。这导致了一个无限循环,应用程序没有加载。即使在修复条目后,我也面临同样的问题。发生这种情况是因为我转储了特定应用程序的数据。应用程序模型之一的 ManyToMany
字段设置为另一个应用程序的模型。虽然 loaddata
在未找到 ForeignKey
字段引用时抛出错误,但我认为它一直在搜索 ManyToMany
字段而不会抛出错误,从而变成无限循环类型的情况。在这里,我要做的就是将整个数据库或相关应用程序转储到同一个文件中。
答案 1 :(得分:1)
读取 this 以获取图像格式错误的部分。
从一个数据库迁移到另一个数据库时,您应该首先转储所有数据,然后在新数据库和加载数据上运行 django 迁移。这应该保留所有列类型。
在运行 loaddata 时,应该先加载没有依赖关系的表,然后再加载依赖于那些已经加载的表。