sqlite数据库迁移至本地MySQL数据库

参考博客:

  • 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

sqlite数据库迁移至本地MySQL数据库_第1张图片
新增filename.json文件.png

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 默认端口
    }
}

你可能感兴趣的:(sqlite数据库迁移至本地MySQL数据库)