将 Django 数据库后端从 MySql 更改为 PostgreSQL
Posted
技术标签:
【中文标题】将 Django 数据库后端从 MySql 更改为 PostgreSQL【英文标题】:Changing Django database backend from MySql to 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?
我看到this*** 问题,但它谈到他的数据库太大。我认为我的数据库不会出现这种情况。我的 Django 项目中没有任何自定义 SQL 命令。
【问题讨论】:
只需尝试答案***.com/a/8385094/540341 中给出的mysql2postgres - 如果一切正常,则需要几分钟。您可以在迁移之前备份您的数据库和配置,以确保 100% 安全。 另一种选择是留在 MySQL 但更改表 InnoDB 引擎。见***.com/questions/4834415/… @filiprem,谢谢,这可能有效。我很感兴趣,但如果专门迁移到 postgreSQL 也会避免这种情况。我还有其他几个想要迁移的原因。我读到了 mysql2postgres,如果简单的 dumpdata/loaddata 出现问题,这将是一个很好的后备。 @filiprem InnoDB 支持 DDL 事务吗? 顺便说一句,***.com/questions/4834415/… 并没有表明如果您使用 InnoDB,South 会停止抱怨。 South 在 InnoDB 上工作,但由于缺少事务功能,当您的迁移失败时它仍然会抱怨。 【参考方案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
【讨论】:
谢谢,这正是我需要的信息。我将尝试您成功的迁移路线。 我目前正在部署此解决方案。它有效,到目前为止遇到的唯一问题是:***.com/questions/6466836/…以上是关于将 Django 数据库后端从 MySql 更改为 PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章
Django - 将 ForeignKey 关系更改为 OneToOne
加载数据转储时,将 Django 项目从 sqlite3 后端切换到 postgresql 失败