如何轻松地将 Django 应用程序从 mySQL 转换为 PostgreSQL?

Posted

技术标签:

【中文标题】如何轻松地将 Django 应用程序从 mySQL 转换为 PostgreSQL?【英文标题】:How can I easily convert a Django app from mySQL to PostgreSQL? 【发布时间】:2011-06-25 06:39:04 【问题描述】:

有人做过吗?这是一个简单的过程吗?我们正在考虑为事务切换,因为 mysql 最近似乎正在“崩溃”。

【问题讨论】:

1) MySql 确实支持事务 (InnoDB) 2) 是什么让您认为 MySql 最近“崩溃”了? 现在我们将开始得到这些错误的提示: OperationalError: (1205, 'Lock wait timeout exceeded; try restarting transaction') 另外,在 Django 中使用 South 有时会在没有实际事务的情况下造成伤害。 MySQL 不支持模式事务 - 这可能会导致迁移非常头疼 【参考方案1】:

使用 Django 将 MySQL 数据库转换为 Postgres 数据库

首先将旧Mysql数据库的数据备份到json夹具中:

$ python manage.py dumpdata contenttypes --indent=4 --natural-foreign > contenttype.json
$ python manage.py dumpdata --exclude contenttypes --indent=4 --natural-foreign > everything_else.json

然后将你的 settings.DATABASES 切换到 postgres 设置。

在 Postgresql 中创建表:

$ python manage.py migrate

现在删除迁移中自动生成的所有内容(django 内容类型、用户组等):

$ python manage.py sqlflush | ./manage.py dbshell

现在您可以安全地导入所有内容,并保持您的 pk 不变!

$ python manage.py loaddata contenttype.json
$ python manage.py loaddata everything_else.json

用 Django==1.8 测试

【讨论】:

与 Django==1.11.4 完美配合 天啊,你拯救了我的一天......我一直试图在周末使用 pdloader 将我的数据从 MySQL 移动到 PGSQL。该工具总是给我一个奇怪的错误,我什至不知道如何开始调试......你的方式真是太棒了。非常感谢,您的回答应该是被接受的! 谢谢!我的 django 项目在这里也取得了成功,但是在我注释掉我所有的 post_save.connect() 回调(正在创建额外的条目)之前,我得到了重复的 PK 关键错误。【参考方案2】:

我编写了一个 Django 管理命令,将一个数据库复制到另一个数据库: https://gist.github.com/mturilin/1ed9763ab4aa98516a7d

您需要在设置中添加两个数据库并使用此命令:

./manage.py copy_db from_database to_database app1 app2 app3 --delete --ignore-errors

这个命令最酷的地方在于它递归地复制依赖对象。例如,如果模型有 2 个外键和两个多对多关系,它会先复制其他对象,以确保不会出现外键违规错误。

【讨论】:

【参考方案3】:

    python manage.py dump.data >> data.json

    在 postrgesql 中创建数据库和用户

    将您刚刚在 postrgesql 中创建的数据库设置为 django 设置中的默认数据库或使用参数 --database=your_postrgesql_database 下一步

    运行 syncdb 以创建表。

    python syncdb [--database=your_postrgesql_database] --noinput

    创建没有数据的转储,删除所有表并加载转储。或截断所有表(表 django_content_type 数据可能不等于您的旧数据 - 这是很多错误的方式)。这一步我们需要 postgresql-db 中的空表。

    当您在 postgresql-db 中有空表时,只需加载您的数据:

    python manage.py loaddata data.json

玩得开心!

【讨论】:

【参考方案4】:

您可以使用 Django 序列化程序将数据从 MySQL 格式输出到 JSON,然后再返回到 Postgres。互联网上有一些很好的文章:

Migrating Django from MySQL to PostgreSQL the Easy Way

Move a Django site to PostgreSQL: check

【讨论】:

【参考方案5】:

我刚刚使用此工具迁移了一个内部应用程序,效果非常好。 https://github.com/maxlapshin/mysql2postgres

【讨论】:

【参考方案6】:

我也没做过。 我会先关注这个migration guide, there is a MySql section,它应该会处理您的所有数据。然后django只需在设置中将mysql切换为postgre。我觉得应该没问题。

我在 *** 上发现了另一个问题,它应该有助于将 mysql 转换为 postgre here。

【讨论】:

【参考方案7】:

我从未亲自做过,但似乎将 manage.py 的 dumpdata 和 loaddata 选项组合起来可以很容易地解决您的问题。也就是说,除非您在 ORM 之外有很多特定于数据库的东西,例如存储过程。

【讨论】:

可以,但有时需要截断所有刚刚由syncdb创建的表 转储数据在序列化之前将整个数据集加载到内存中 - 这对于大型数据集来说是一个问题。 of***lyn.com/2010/07/18/… 展示了如何分块这个进程以避免你的服务器崩溃。

以上是关于如何轻松地将 Django 应用程序从 mySQL 转换为 PostgreSQL?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 netbeans 轻松地将任何数据库视图绑定到 jtable?

在 Python 中轻松地将变量从/向命名空间/字典转储

Django - 如何正确地将列表从模板发送到 AJAX 以查看?

如何轻松地将 CSV 文件处理为 List<MyClass>

如何设计一个应用程序来轻松地将Hibernate与JDBC交换

Xcode:如何轻松地将我的 Int 值从 UIview 传递到下一个 UIViewcontroller?