将 Django DB 从 SQLite 迁移到 MySQL 的最佳方法是啥?

Posted

技术标签:

【中文标题】将 Django DB 从 SQLite 迁移到 MySQL 的最佳方法是啥?【英文标题】:What's the best way to migrate a Django DB from SQLite to MySQL?将 Django DB 从 SQLite 迁移到 MySQL 的最佳方法是什么? 【发布时间】:2011-03-03 08:54:09 【问题描述】:

我需要将我的数据库从 sqlite 迁移到 mysql,而那里的各种工具/脚本太多了,我无法轻松找到最安全和最优雅的解决方案。

这在我看来不错 http://djangosnippets.org/snippets/14/ 但似乎已经 3 年没有更新了,这令人担忧..

您能否推荐一个已知在 Django 1.1.1 中可靠的解决方案?

【问题讨论】:

我猜你已经尝试了dumpdata,然后是loaddata 【参考方案1】:

执行:

python manage.py dumpdata > datadump.json

接下来,将您的 settings.py 更改为 mysql 数据库。

最后:

python manage.py loaddata datadump.json

【讨论】:

除非有时这行不通,如果你已经将 unicode 数据放入 sql 中的字符串中,fixture creator 和 mysql 似乎无法相处。至少,这就是我来这里试图弄清楚如何解决的问题。 或者由于完整性错误......或许多其他问题,这不起作用。 有时会引发“...不是 JSON 可序列化的” 运行 dumpdata > datadump.json 引发错误:CommandError: No installed app with label '>'.【参考方案2】:

经过一番艰苦的搜索,我遇到了几个问题,我希望将来寻找答案的人会觉得有用。

我的公式是

    python manage.py dumpdata > datadump.json 将 settings.py 更改为您的 mysql 确保您可以连接到您的 mysql(权限等) python manage.py migrate --run-syncdb

    在 shell 中使用这个 sn-p 排除内容类型数据

    python manage.py shell

    from django.contrib.contenttypes.models import ContentType ContentType.objects.all().delete() quit()

    python manage.py loaddata datadump.json

希望对你有帮助!

【讨论】:

内容类型数据排除有什么作用? @DeltaG 标准答案是this。但我找到的最佳答案是:this one 这对我也有用。 loaddata 命令需要执行第 5 步。 我得到了这个答案 django.db.models.fields.related_descriptors.RelatedObjectDoesNotExist:安装夹具时出现问题'/home/ubuntu/news-manifest-master/datadump.json':评论没有 content_type。 为什么要运行-syncdb?没有那个我不得不跑【参考方案3】:

我从 sqlite 迁移到 MySQL 所需的步骤(更完整)列表,YMMV:

    python manage.py dumpdata > datadump.json 确保您可以连接到您的 mysql(权限等) 确保您有修改 FOREIGN_KEY_CHECKS 的权限(为此,我必须安装并运行我自己的私有 mysql 实例) 确保未使用 InnoDB 引擎(在每个表中使用 MyISAM),否则下一步将无法工作(静默失败)! 通过此命令放松验证(这在 InnoDB 中不会生效): SET GLOBAL FOREIGN_KEY_CHECKS = 0; 单独加载 django_site.sql 表(如果使用 contrib.sites) 将 settings.py 更改为您的新 mysql python manage.py migrate --run-syncdb 通过修改 Django 应用程序的 /migrations 目录中的代码和必要时的数据库表来修复 syncdb 错误错误 用这个 sn-p 排除 contentype 数据(可以放在主 urls.py 模块中): from django.contrib.contenttypes.models import ContentType ContentType.objects.all().delete() quit() 如果需要编辑json数据必须先美化: cat datadump.json | python -m json.tool > datadump_pretty.json python manage.py loaddata datadump.json 修复所有数据截断问题 将时区数据添加到数据库: mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -D mysql -P 1234 -u root -p --protocol=tcp mysql -P 1234 -u root -p -e "flush tables" --protocol=tcp 在不提交任何数据的情况下测试网站是否正常运行 SET GLOBAL FOREIGN_KEY_CHECKS = 1; 测试其余部分

【讨论】:

【参考方案4】:

这是避免其他地方描述的ContentType 问题的一种更简洁的方法:

./manage.py dumpdata --exclude contenttypes --exclude auth.permission --exclude sessions --indent 2 > dump.json

然后:

./manage.py loaddata dump.json

【讨论】:

这是一个有用的补充;您可以通过添加更多步骤来改进此答案,例如 Carlos Henrique Cano 的答案。

以上是关于将 Django DB 从 SQLite 迁移到 MySQL 的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

South - 将 django 应用程序从 sqlite 迁移到 mysql

如何将 Django 模型从 mysql 迁移到 sqlite(或在任何两个数据库系统之间)?

从 Sqlite 迁移到 CoreData

django数据迁移

Django:将数据从 SQLite 移动到 PostgreSQL

ruby Camaleon CMS将sqlite3迁移到mysql DB