如何将 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?