将 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(或在任何两个数据库系统之间)?