【问题标题】:Changing Django database backend from MySql to PostgreSQL将 Django 数据库后端从 MySql 更改为 PostgreSQL
【发布时间】:2012-02-12 07:13:35
【问题描述】:

我使用 Django 1.2 和 1.3 以及 MySql 后端。

使用 South 迁移 MySql 数据库时偶尔会收到错误消息:

! Error found during real run of migration! Aborting.

! Since you have a database that does not support running
! schema-altering statements in transactions, we have had 
! to leave it in an interim state between migrations.
...
! The South developers regret this has happened, and would
! like to gently persuade you to consider a slightly
! easier-to-deal-with DBMS

我想知道将我的数据库从 MySql 迁移到 PostgreSQL 是否可以防止此错误。其次,从 MySql 迁移到 PostgreSQL 是否会更多地涉及在 MySql 数据库上执行转储数据,将设置更改为指向 PostgreSQL 和新后端上的 loaddata?

我看到thisstackoverflow 问题,但它谈到他的数据库太大。我认为我的数据库不会出现这种情况。我的 Django 项目中没有任何自定义 SQL 命令。

【问题讨论】:

  • 只需尝试答案stackoverflow.com/a/8385094/540341 中给出的mysql2postgres - 如果一切正常,则需要几分钟。您可以在迁移之前备份您的数据库和配置,以确保 100% 安全。
  • 另一种选择是留在 MySQL 但更改表 InnoDB 引擎。见stackoverflow.com/questions/4834415/…
  • @filiprem,谢谢,这可能有效。我很感兴趣,但如果专门迁移到 postgreSQL 也会避免这种情况。我还有其他几个想要迁移的原因。我读到了 mysql2postgres,如果简单的 dumpdata/loaddata 出现问题,这将是一个很好的后备。
  • @filiprem InnoDB 支持 DDL 事务吗?
  • 顺便说一句,stackoverflow.com/questions/4834415/… 并没有表明如果您使用 InnoDB,South 会停止抱怨。 South 在 InnoDB 上工作,但由于缺少事务功能,当您的迁移失败时它仍然会抱怨。

标签: mysql django postgresql database-migration django-south


【解决方案1】:

我已经厌倦了使用 South 看到这个错误,是的,切换到 PostgreSQL 已经消除了它!

上面 cmets 中建议的用 Ruby 编写的 mysql2postgres 应用程序对我不起作用(它会运行,将一些详细信息输出到屏幕但不会复制任何数据行,对我来说)。不知道为什么。但很高兴有一个 Python 重写它完美地工作(对我来说,最终):
http://pypi.python.org/pypi/py-mysql2pgsql

我发现的唯一问题是:

最初我认为通过syncdb在PostgreSQL db中设置表然后只迁移数据是最安全的。我试过了,但是表是按字母顺序迁移的,这违反了某些表的外键约束(行与尚未导入的表中的行相关)。

接下来我尝试了结构+数据迁移。这迁移得很好,但后来我在 Django 中遇到了一些问题,尤其是管理站点。迁移脚本似乎创建了一些与 Django 不同的表约束。

我通过破解 mysql2pgsql 脚本来解决这个问题,以尊重 yaml 配置only_tables 属性中给出的表的顺序......然后进行同步数据库 + 仅数据迁移。通过反复试验,我调整了迁移表的顺序,直到它们全部成功导入。

更新:
我对上述黑客的拉取请求已被接受,因此您现在可以从主版本执行此操作:
https://github.com/philipsoutham/py-mysql2pgsql

【讨论】:

  • 谢谢,这正是我需要的信息。我将尝试您成功的迁移路线。
  • 我目前正在部署此解决方案。它有效,到目前为止遇到的唯一问题是:stackoverflow.com/questions/6466836/…
猜你喜欢
  • 1970-01-01
  • 2021-05-21
  • 2021-10-01
  • 2017-01-12
  • 2018-10-23
  • 2021-06-29
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多