Django切换数据库和迁移数据详解
前言
今天来分享一下 Django 项目切换数据库和迁移数据的方案,网络上找到的文章方法不一,且使用中容易遇到各类报错,本文根据 Django 官方文档和工作中的经验,稳定可靠,在博客中长期更新~
如果你遇到同样的问题,阅读本文应该能得到比较好的解决方案。
基本步骤
Django 默认使用 SQLite 数据库方便开发,同时其 ORM 支持多种数据库,只要安装对应的驱动就行。
切换数据库一般是将开发环境的 SQLite 切换到 MySQL (MariaDB) 或 PostgreSql ,本文只测试了从 SQLite 到 MySQL / PostgreSQL,同理,其他切换路径也是可以的。
数据库的表结构没啥问题,使用 Django 的 migrate 功能就行了
关键在于数据迁移,可以使用 Navicat 之类的数据库工具进行数据同步,但往往会因为表之间的约束关系导致同步失败(要求按特定顺序导入数据)。
所以最好的方法是使用 Django 的 dumpdata
功能,将数据库导出为 json 或 xml 文件,然后切换数据库再导入。
步骤如下:
- 导出原有数据:
python manage.py dumpdata -o db.json
- 在目标数据库(MySQL / PostgreSql)里创建一个空的库
- 在
settings.py
里切换到新的数据库 - 建立新的数据库表结构
python manage.py migrate
- 导入原有数据:
python manage.py loaddata db.json
搞定~
附上几种数据库配置,方便使用
db_config = { 'sqlite': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'OPTIONS': { 'timeout': 20, } }, 'pgsql': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': '数据库名称', 'USER': '用户名', 'PASSWORD': '密码', 'HOST': '数据库服务器地址', 'PORT': 5432, }, 'mysql': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '数据库名称', 'USER': '用户名', 'PASSWORD': '密码', 'HOST': '数据库服务器地址', 'PORT': 3306, } } # 这里可以方便切换不同数据库 DATABASES = {'default': db_config['pgsql']}
其中:
- MySQL 需要安装
mysqlclient
包 - PostgreSql 需要安装
psycopg2
包
然后,事情往往没有这么简单和顺利,导出导入的过程中可能会遇到一些问题,请继续看~
导出报错
报错信息
CommandError: Unable to serialize database: 'gbk' codec can't encode character '\u30fb' in position 4: illegal multibyte sequence
原因跟编码有关
解决方法
使用 Python 的 UTF-8 模式导出数据就没问题
用这个命令导出文件
(不导出 auth.permission
和 contenttypes
,这俩在 migrate
时会自动生成,这样避免了导入原有数据时冲突)
python -Xutf8 manage.py dumpdata --exclude auth.permission --exclude contenttypes > db.json
或者
python -Xutf8 manage.py dumpdata -o db.json
导入过程出错解决
报错1: Duplicate entry
报错信息
django.db.utils.IntegrityError: Problem installing fixture 'db.json' Could not load contenttypes.ContentType(pk=15): (1062, "Duplicate entry 'xxx' for key 'django_content_type.django_content_type_app_label_model_76bd3d3b_uniq'")
解决方法一: 重新导出数据
加上这俩参数
--natural-primary
: Omits the primary key in the serialized data of this object since it can be calculated during deserialization.--natural-foreign
: Uses the natural_key() model method to serialize any foreign key and many-to-many relationship to objects of the type that defines the method.
作用是导出的时候去除一些约束,导入时会自动处理,减少导入时因为表之间约束关系的问题
python3 manage.py dumpdata --natural-primary --natural-foreign -o db.json
解决方法二: 删除 content_type
数据
另一种思路,把 migrate
过程产生的初始化数据删了,避免导入时和原有数据冲突
先进入 python shell
python3 manage.py shell
输入以下Python代码执行
from django.contrib.contenttypes.models import ContentType ContentType.objects.all().delete()
报错2: 编码错误
报错信息
UnicodeDecodeError: ‘utf-8' codec can't decode byte 0xff in position 0: invalid start byte in Django
解决方法一: 使用 Python 的 UTF8 模式(推荐)
在导入命令前面加上 -Xutf8
参数
python -Xutf8 manage.py loaddata db.json
解决方案二: 魔改 Django 代码
能用,但不推荐,实在没办法再来试这个方法
修改文件
lib\site-packages\django\core\serializers\json.py
在 Deserializer
方法中找到这行代码
stream_or_string = stream_or_string.decode()
改成这样
stream_or_string = stream_or_string.decode('UTF-16')
再进行导入操作
参考资料
- https://docs.djangoproject.com/en/4.1/ref/django-admin/
- https://www.shubhamdipt.com/blog/django-transfer-data-from-sqlite-to-another-database/
- https://javaatpoint.com/solved-unicodedecodeerror-utf-8-codec-cant-decode-byte-0xff-in-position-0-invalid-start-byte/
- https://counter2015.com/2020/01/15/django-migration-sqlite-to-postgre/
- https://stackoverflow.com/questions/64457733/django-dumpdata-fails-on-special-characters
到此这篇关于Django切换数据库和迁移数据详解的文章就介绍到这了,更多相关Django切换数据库和迁移数据内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
原文出处:https://www.cnblogs.com/deali/p/16884908.html
相关文章
Django def clean()函数对表单中的数据进行验证操作
这篇文章主要介绍了Django def clean()函数对表单中的数据进行验证操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-09- 这篇文章主要介绍了在Django中使用MQTT的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-10
解决导入django_filters不成功问题No module named 'django_filter'
这篇文章主要介绍了解决导入django_filters不成功问题No module named 'django_filter',具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-15详解如何使用Docker部署Django+MySQL8开发环境
这篇文章主要介绍了详解如何使用Docker部署Django+MySQL8开发环境,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-07-19- 这篇文章主要介绍了Django 解决由save方法引发的错误,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-21
- 这篇文章主要介绍了django前端页面下拉选择框默认值设置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-10
- 这篇文章主要介绍了使用perl实现拆分数据表(mysql)并迁移数据实例,本文提供了3个脚本,分别用于拆分数据表、迁移数据、插入测试数据,需要的朋友可以参考下...2020-06-29
- 这篇文章主要介绍了django数据模型中null和blank的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-03
- 这篇文章主要介绍了Django表单外键选项初始化的问题及解决方法,需本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,要的朋友可以参考下...2021-04-29
- 本文主要介绍了Django项目连接MongoDB的三种方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-27
- 这篇文章主要给大家介绍了关于使用AJAX和Django获取数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-25
- 这篇文章主要介绍了django ajax发送post请求的两种方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-04-30
Django开发RESTful API实现增删改查(入门级)
这篇文章主要介绍了Django开发RESTful API实现增删改查(入门级),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-10Django获取model中的字段名和字段的verbose_name方式
这篇文章主要介绍了Django获取model中的字段名和字段的verbose_name方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-20- 这篇文章主要介绍了django中url映射规则和服务端响应顺序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-05-10
- 在本篇文章里小编给大家整理的是一篇关于Django后台管理系统的图文使用教学内容,需要的朋友们参考下。...2020-04-22
- 本文总结了如何获得SSL证书并给Django项目配置HTTPS,建议先收藏再阅读,将来有一天你很可能会用到它。...2021-05-01
- 这篇文章主要介绍了Django-ORM-连表正反操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-06-13
- 这篇文章主要介绍了Python Django搭建文件下载服务器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-10
- 这篇文章主要介绍了django 连接数据库出现1045错误的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-15