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


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


3380
2018-02-11 01:12


起源

1)MySql确实支持事务(InnoDB)2)是什么让你觉得MySql最近“扯掉”? - The Scrum Meister
由于我们现在的原因,我们将开始了解这些错误:OperationalError:(1205,'超过锁定等待超时;尝试重新启动事务')此外,使用South与Django有时会在没有实际事务的情况下受伤。 - Ryan Detzel
MySQL不支持模式事务 - 这可能会导致迁移的巨大问题 - yarbelk


答案:


我刚刚使用这个工具来迁移内部应用程序,它运行得非常好。 https://github.com/maxlapshin/mysql2postgres


4
2018-02-16 08:46





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

首先备份json fixtures中旧的Mysql数据库的数据:

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

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

在Postgresql中创建表:

$ python manage.py migrate

现在删除在迁移中自动生成的所有内容(django contenttypes,usergroups等):

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

现在你可以安全地导入所有内容,并保持你的pk一样!

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

用Django == 1.8测试


9
2018-05-08 16:53



用Django == 1.11.4完美地为我工作 - endur


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

简单地将Django从MySQL迁移到PostgreSQL

将Django站点移动到PostgreSQL:检查


2
2018-06-15 19:26





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


1
2018-02-11 01:38



这工作,但有时需要截断由syncdb创建的所有表 - Alexey
dump数据在序列化之前将整个数据集加载到memoery中 - 这对于大型数据集来说是个问题。 ofbrooklyn.com/2010/07/18/... 显示如何分块此过程以避免崩溃您的服务器。 - yarbelk


我也没做过。 我先跟着这个 迁移指南,有一个MySql部分 这应该照顾你的所有数据。然后django只是在设置中将mysql切换到postgre。我认为应该没问题。

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


0
2018-02-11 08:09





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

  2. 在postrgesql中创建数据库和用户

  3. 在django设置中将刚刚创建的数据库设置为postrgesql中的默认数据库,或者使用param --database = your_postrgesql_database后续步骤
  4. 为create table运行syncdb。

    python syncdb [--database = your_postrgesql_database] - noinput

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

  6. 在postgresql-db中有空表时只需加载数据:

    python manage.py loaddata data.json

好玩!


0
2018-02-18 05:02





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

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

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

这个命令很酷的是它以递归方式复制依赖对象。例如,如果模型有2个外键和2个多对多关系,它将首先复制其他对象以确保不会出现外键冲突错误。


0
2018-04-30 00:10