跳转至

如何将 Django数据库 从 Sqlite3 迁移到 Mysql?


2019-02-12 by dongnan

目标

  • django 项目默认使用的 sqlite3数据库,调整为 mysql数据库 。
  • sqlite3 中的数据,迁移到 mysql数据库。

环境

Django-1.11
Python-3.4

准备工作

创建一个 MySQL 服务器,方便演示使用 docker 创建 mysql 容器。

docker run --name mysql-server -t \
       -e MYSQL_DATABASE="cmdb" \
       -e MYSQL_USER="admin" \
       -e MYSQL_PASSWORD="admin0" \
       -e MYSQL_ROOT_PASSWORD="admin0" \
       -e TZ=Asia/Chongqing \
       -v /etc/localtime:/etc/localtime:ro \
       -v mysql-data:/var/lib/mysql \
       -d mysql:5.7 \
         --character-set-server=utf8 \
         --collation-server=utf8_general_ci \
         --sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

为 django 安装 pymysql包

# python3 不再支持 mysqldb包,所以使用 pymysql包与 mysql服务器进行通信。
pip install pymysql

在项目根目录下中的__init__.py文件中添加以下代码

vim cmdb/cmdb/__init__.py

import pymysql
pymysql.install_as_MySQLdb()

操作步骤

导出备份数据

python manage.py dumpdata > all.json

修改配置文件

# 将 mysql 数据库添加到 setting.py文件中,类似如下:

vim cmdb/cmdb/settings.py
#
DATABASES = {
    #'default': {
    #    'ENGINE': 'django.db.backends.sqlite3',
    #    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    #},
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "cmdb",
        "USER": "root",
        "PASSWORD": "admin0",
        "HOST": "172.17.0.2",    # mysql 容器 ip地址
        "PORT": "3306",
    },
}

创建表结构

python manage.py migrate

删除无效数据

# 登录 django shell控制台,导入 ContentType模型 ,并其删除数据。
python manage.py shell
Python 3.5.2 (default, Nov 12 2018, 13:43:14)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.contrib.contenttypes.models import ContentType
>>> ContentType.objects.all().delete()
(44, {'users.User_user_permissions': 0, 'auth.Permission': 33, 'contenttypes.ContentType': 11, 'auth.Group_permissions': 0})
>>> quit()

迁移/导入备份数据

python manage.py loaddata all.json
Installed 134 object(s) from 1 fixture(s)

检查数据库

验证

启动服务器,并使用浏览器访问,检查是否正常。

python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
February 12, 2019 - 15:19:30
Django version 1.11, using settings 'cmdb.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[12/Feb/2019 15:19:35] "GET / HTTP/1.1" 302 0
[12/Feb/2019 15:19:35] "GET /users/login/?next=/ HTTP/1.1" 200 3534
[12/Feb/2019 15:19:37] "POST /users/login/ HTTP/1.1" 302 0
[12/Feb/2019 15:19:37] "GET / HTTP/1.1" 200 19618 

参考

What's the best way to migrate a Django DB from SQLite to MySQL?

回到页面顶部