2021年9月20日 16:15 by wst
django之前做Django开发,用的是默认数据库,即sqlite。但它不利于迁移,所以想着从sqlite迁移MySQL。中间踩了个不大不小的坑,在此记录,为后来者提供一点经验。
1. 修改 Django项目 中的 settings.py 中的 DATABASES 参数为如下形式:
# 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': '127.0.0.1', # 创建mysql用户时,使用此host配置
'PORT': '3306', # mysql 默认端口
}
}
2. 替换连接MySQL用的库,更改与 settings.py 同级的 __init__.py 文件
# filename: __init__.py
import pymysql
pymysql.install_as_MySQLdb()
3. 创建mysql用户,把第一步中添加用户在mysql创建一下
以root用户登录MySQL之后,执行以下命令创建用户:
CREATE DATABASE IF NOT EXISTS dbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
-- 这里的127.0.0.1要和上文的host配置保持一致
CREATE USER 'username'@'127.0.0.1' IDENTIFIED BY 'password';
GRANT ALL privileges ON dbname.* TO 'username'@'127.0.0.1';
4. 将 sqlite数据库中的 模型和迁移数据 同步到 MySQL数据库中,执行如下命令:
python manage.py migrate --database substitute
5. 把sqlite中的数据导出到filename.json中;
python manage.py dumpdata > filename.json # filename为备份导出的文件名
6. 把导出的数据filename.jso导入到MySQL中
操作之前把settings.py中的DATABASES配置修改为只用MySQL
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dbname', # mysql数据库的用于存放sqlite数据的 dbname
'USER': 'username', # mysql数据库中的 USER
'PASSWORD': 'password', # mysql数据库 USER 对应的密码
'HOST': '127.0.0.1', # 创建mysql用户时,使用此host配置
'PORT': '3306', # mysql 默认端口
}
}
然后执行这个命令:
python manage.py loaddata filename.json
成功后显示如下:
Installed 41 object(s) from 1 fixture(s)
可能遇到的问题:
错误信息:Could not load contenttypes.ContentType(pk=7): (1062, "Duplicate entry 'official-contactinfo' for key 'django_content_type_app_label_model_76bd3d3b_uniq'")
解决方案:
登录mysql执行以下命令
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE auth_permission;
TRUNCATE django_content_type;
SET FOREIGN_KEY_CHECKS = 1;
在整个迁移过程中,需要注意:
1. 导出数据时,全部导出;
2. 导入数据时,要提前创建好mysql的用户和库,以及设置删除时不检查主外键关联;