参考博客:
- https://blog.csdn.net/weixin_34257076/article/details/86843658
- https://www.cnblogs.com/zhangxinqi/p/9094953.html
问题背景
有时候写的Django项目会一开始图省事,就直接用Django自带的数据库 sqlite,它同时也是Django项目默认的数据库,但是随着后续项目数据量增多,或者为了数据管理方便,我们可能需要将数据从sqlite数据库 迁移 到MySQL数据库,本篇文章将会带你一步步实现Django项目数据sqlite 到 MySQL 的迁移。
环境+工具
Python3.6 + Django2.0 + PyCharm + Mysql5.7 + Mac
数据迁移步骤
Step 1:修改 Django项目 中的 settings.py 中的 DATABASES 参数
# filename: settings.py
# old configuration
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
更改为:
# filename: settings.py
# new configuration
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'substitute': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dbname', # mysql数据库的用于存放sqlite数据的 dbname
'USER': 'username', # mysql数据库中的 USER
'PASSWORD': 'password', # mysql数据库 USER 对应的密码
'HOST': 'localhost', # 访问的地址(localhost|127.0.0.1|'') 都代表本机
'PORT': '3306', # mysql 默认端口
}
}
注意: DATABASE 的配置添加 MySQL数据库 后,Django连接MySQL默认调用的是 python2 中的 MySQLDB库,但在 python3中 MySQLDB库被 pymysql库代替,所以需将 python3中 pymysql库 更名为 Django调用的 MySQLDB库,Django 才能连接 MySQL 成功。
Step 1.1 用 pymysql库 代替 MySQLDB库
更改与 settings.py 同级的 __init__.py 文件
# filename: __init__.py
import pymysql
pymysql.install_as_MySQLdb()
Step 2:将 sqlite数据库中的 模型和迁移数据 同步到 MySQL数据库中
migrate管理命令会同时在每一个数据库上运行,默认情况下它在default数据库上运行 ,可以通过选项 --database来指定需要同步的数据库。如不指定会同步到default数据库上。
注意: 这一步是将 模型 和 迁移数据 同步到 配置好的substitute中的数据库 中
此时,打开 substitue配置的MySQL数据库,会出现数据表结构如下:
mysql> show tables;
+----------------------------+
| Tables_in_mysite |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| blog_blogarticles |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
11 rows in set (0.00 sec)
Step 3:将sqlite数据库中的数据备份导出
# pycharm命令台
python manage.py dumpdata default > filename.json # filename为备份导出的文件名
操作之后,在 Pycharm中的Django项目中会出增加一个文件 filename.json
Step 4:将备份数据导入到MySQL数据库中
# pycharm命令台
python manage.py loaddata --database dbname filename.json
成功显示如下:
# pycharm命令台
Installed 41 object(s) from 1 fixture(s)
Step 4.1:可能出现的导入数据重复问题
注意:在 Step 2中因为把 迁移数据导入过一次MySQL数据库中,所以在 Step 3中导入数据时,可能会出现两次迁移数据导入
参考博客内容:这是因为auth_permission和django_content_type中存在数据,这些数据是在给MySQL数据库应用迁移文件的时候产生的,一般是content_type相关的表。
此时Pycharm 的命令端会报错如下:
错误提示:django.db.utils.IntegrityError: Problem installing fixture 'E:\Sync\OneDrive\PycharmProjects\StarMeow\dumpdata20181024.json': Could not load contenttypes.ContentType(pk=6): (1062, "Duplicate entry 'usercenter-userprofile' for key 'django_content_type_app_label_model_76bd3d3b_uniq'")
解决办法如下:
删除MySQL数据库(substitute配置的数据库)中 auth_permission 和 django_content_type 数据表中存在的数据
# 登录mysql,在MySQL中操作
mysql -uusername -ppassword;
use dbname;
delete from auth_permission;
delete from django_content_type;
删除完后再进入 PyCharm 中的命令台
# pycharm命令台
python manage.py loaddata --database dbname filename.json
成功显示如下:
# pycharm命令台
Installed 41 object(s) from 1 fixture(s)
最后,Django项目中的 sqlite数据 迁移至 本地的MySQL数据库就完成啦~
如果要使用 本地中的 MySQL数据库,则更改Django项目中的 settings.py 的 DATABASES 参数:
# filename: settings.py
# old configuration
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'substitute': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dbname', # mysql数据库的用于存放sqlite数据的 dbname
'USER': 'username', # mysql数据库中的 USER
'PASSWORD': 'password', # mysql数据库 USER 对应的密码
'HOST': 'localhost', # 访问的地址(localhost|127.0.0.1|'') 都代表本机
'PORT': '3306', # mysql 默认端口
}
}
更改为:
# filename: settings.py
# new configuration
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dbname', # mysql数据库的用于存放sqlite数据的 dbname
'USER': 'username', # mysql数据库中的 USER
'PASSWORD': 'password', # mysql数据库 USER 对应的密码
'HOST': 'localhost', # 访问的地址(localhost|127.0.0.1|'') 都代表本机
'PORT': '3306', # mysql 默认端口
}
}