{callout color="#00ffff"}
前言 : 前段时间将 流星影院 的所有数据从美国服务器迁移到了香港服务器上,然后今天来分享一下 Django 项目切换数据库和迁移数据的方案,网络上找到的文章方法不一,且使用中容易遇到各类报错,本文根据 Django 官方文档和工作中的经验,稳定可靠,在博客中长期更新~
{/callout}
如果你遇到同样的问题,阅读本文应该能得到比较好的解决方案。
基本步骤
{lamp/}
Django 默认使用 SQLite 数据库方便开发,同时其 ORM 支持多种数据库,只要安装对应的驱动就行。
切换数据库一般是将开发环境的 SQLite 切换到 MySQL (MariaDB) 或 PostgreSql ,本文只测试了从 SQLite 到 MySQL / PostgreSQL,同理,其他切换路径也是可以的。
数据库的表结构没啥问题,使用 Django 的 migrate 功能就行了
关键在于数据迁移,可以使用 Navicat 之类的数据库工具进行数据同步,但往往会因为表之间的约束关系导致同步失败(要求按特定顺序导入数据)。
所以最好的方法是使用 Django 的 dumpdata 功能,将数据库导出为 json 或 xml 文件,然后切换数据库再导入。
步骤如下
{lamp/}
{callout color="#00ff00"}
- 导出原有数据: python manage.py dumpdata -o db.json
- 在目标数据库(MySQL / PostgreSql)里创建一个空的库
- 在 settings.py 里切换到新的数据库
- 建立新的数据库表结构 python manage.py migrate
- 导入原有数据: python manage.py loaddata db.json
{/callout}
OK搞定~
附上几种数据库配置,方便使用
db_config = {
'sqlite': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'OPTIONS': {
'timeout': 20,
}
},
'pgsql': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': '数据库名称',
'USER': '用户名',
'PASSWORD': '密码',
'HOST': '数据库服务器地址',
'PORT': 5432,
},
'mysql': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库名称',
'USER': '用户名',
'PASSWORD': '密码',
'HOST': '数据库服务器地址',
'PORT': 3306,
}
}
# 这里可以方便切换不同数据库
DATABASES = {'default': db_config['pgsql']}
其中:
{callout color="#f0ad4e"}
- MySQL 需要安装 mysqlclient 包
- PostgreSql 需要安装 psycopg2 包
{/callout}
然后,事情往往没有这么简单和顺利,导出导入的过程中可能会遇到一些问题,请继续看~
导出报错
{lamp/}
报错信息
CommandError: Unable to serialize database: 'gbk' codec can't encode character '\u30fb' in position 4: illegal multibyte sequence
原因跟编码有关
解决办法
{lamp/}
使用 Python 的 UTF-8 模式导出数据就没问题
用这个命令导出文件
(不导出 auth.permission 和 contenttypes ,这俩在 migrate 时会自动生成,这样避免了导入原有数据时冲突)
python -Xutf8 manage.py dumpdata --exclude auth.permission --exclude contenttypes > db.json
或者
python -Xutf8 manage.py dumpdata -o db.json