将Django数据库后端从MySql更改为PostgreSQL

我使用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 dbase上执行dumpdata,将设置更改为指向PostgreSQL和新后端的loaddata?

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

最佳答案
我厌倦了使用South看到这个错误,是的,切换到PostgreSQL已经放弃了它!

使用Ruby编写的mysql2postgres应用程序在上面的评论中提出对我不起作用(它会运行,输出一些细节到屏幕但不复制任何数据行,对我来说).不知道为什么.但很高兴有一个Python重写它完美无缺(最终对我来说):
http://pypi.python.org/pypi/py-mysql2pgsql

我发现的唯一问题是:

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

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

我通过破解mysql2pgsql脚本来解决这个问题,以遵守yaml config only_tables属性中给出的表的顺序……然后执行syncdb仅数据迁移.通过反复试验,我对我的迁移表的排序进行了调整,直到它们都成功导入.

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

转载注明原文:将Django数据库后端从MySql更改为PostgreSQL - 代码日志