从 MySql 切换 Django 数据库后端到 PostgreSQL

4

我使用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数据库上执行dumpdata,更改设置以指向PostgreSQL并在新后端上执行loaddata要复杂?我看过这个stackoverflow问题,但它提到了他的数据库太大的问题。我不认为我的数据库会有这个问题。我的Django项目中没有任何自定义SQL命令。

只需尝试在答案中给出的mysql2postgres - https://dev59.com/eV3Va4cB1Zd3GeqPFPTx#8385094,如果一切顺利,它只需要几分钟。您可以在迁移之前备份数据库和配置文件以确保100%的安全。 - filiprem
另一个选择是继续使用MySQL,但更改表的InnoDB引擎。请参见https://dev59.com/BVPTa4cB1Zd3GeqPmtXd - filiprem
@filiprem,谢谢,那可能有效。但我想知道是否专门迁移到postgreSQL也可以避免这种情况。我有几个其他原因想要迁移。我读过mysql2postgres,如果简单的dumpdata/loaddata出现问题,它将是一个很好的备选方案。 - Density 21.5
@filiprem,InnoDB是否支持DDL事务? - armonge
顺便说一下,这个https://dev59.com/BVPTa4cB1Zd3GeqPmtXd并没有显示出如果您使用InnoDB,South会停止抱怨。South在InnoDB上工作,但是当您的迁移由于缺乏事务功能而失败时,它仍然会抱怨。 - Anentropic
1个回答

5

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

上面评论中提到的用Ruby编写的mysql2postgres应用程序对我没用(它会运行,在屏幕上输出一些细节,但不会复制任何数据行)。不知道为什么。但幸运的是,有一个Python版本的重写,可以完美地工作(对我而言,最终如此):
http://pypi.python.org/pypi/py-mysql2pgsql

我发现唯一的问题是:

起初,我认为通过同步数据库来设置PostgreSQL数据库中的表并仅迁移数据是最安全的方法。我尝试过这个方法,但是表按字母顺序迁移,这违反了某些表的外键约束(行与尚未导入的表中的行相关联)。

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

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

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


谢谢,这正是我需要的信息。我将尝试您成功的迁移路线。 - Density 21.5
我目前正在部署这个解决方案。它能够工作,到目前为止唯一遇到的问题是:https://dev59.com/QljUa4cB1Zd3GeqPSpbw - Density 21.5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接