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