【问题标题】: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

标签: mysql database django sqlite migration


【解决方案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】:

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

我的公式是

  1. python manage.py dumpdata > datadump.json
  2. 将 settings.py 更改为您的 mysql
  3. 确保您可以连接到您的 mysql(权限等)
  4. python manage.py migrate --run-syncdb
  5. 在 shell 中使用这个 sn-p 排除内容类型数据

    python manage.py shell

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

  6. 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:

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

【讨论】:

    【解决方案4】:

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

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

    然后:

    ./manage.py loaddata dump.json
    

    【讨论】:

    • 这是一个有用的补充;您可以通过添加更多步骤来改进此答案,例如 Carlos Henrique Cano 的答案。
    猜你喜欢
    • 2019-08-20
    • 2011-03-29
    • 1970-01-01
    • 2010-09-13
    • 2010-09-15
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多