【问题标题】:Django sqlite to postgres database migrationDjango sqlite 到 postgres 数据库迁移
【发布时间】:2021-09-21 16:19:52
【问题描述】:

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

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

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

【问题讨论】:

  • 你能发布你用于加载数据的命令吗?
  • ./manage.py loaddata -v 3 data.json
  • 您是否定义了多个数据库?您是否尝试将 --app 添加到命令中,python manage.py loaddata -v3 --app YOURAPP data.json
  • 是的,我做过类似的事情。转储特定的应用程序,然后尝试加载数据。我的一个应用程序存在不处理 json 文件中的对象的问题。
  • 是的。我曾是。现在问题已经解决了。我有一个递归模型架构,其中一个条目已损坏,导致此问题

标签: django postgresql sqlite database-migration


【解决方案1】:

请阅读this 了解图像格式错误的部分。

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

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

【讨论】:

  • 至于格式错误的图像问题,我认为原因可能是下载数据库。由于数据库在远程服务器中,我实际上是使用 scp 命令在本地复制数据库。不知何故,复制时数据库可能已损坏。对于迁移,我实际上也在做同样的事情。但问题是我的一个应用程序在运行loaddata 时没有加载。这是主要问题。至于依赖,这个应用的表没有依赖
  • 你试过压缩db文件然后复制吗?
  • 没有。我会尝试的.. 任何关于 loaddata 问题的想法?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-06-23
    • 2016-09-04
    • 2016-08-24
    • 2023-03-12
    • 2014-07-21
    • 2015-09-10
    • 2018-11-26
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多