如何轻松地将 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?
Django - 如何正确地将列表从模板发送到 AJAX 以查看?
如何轻松地将 CSV 文件处理为 List<MyClass>