要把Django当前项目的数据库从sqlite3切换为PostgreSQL,基本思路就是先使用Django的Dump命令把sqlite3数据导出,然后将settings文件中的数据源更改为PostgreSQL,最后再使用Django的loaddata命令将数据导入。
环境
Ubuntu 16.04
PostgreSQL 9.5
Django 1.11.11
1. 导出(dump)已有的数据
python3 manage.py dumpdata > datadump.json
导出的时候,可能出现这个错误提示:
CommandError: Unable to serialize database: no such table: filebrowser_filebrowser
将这个model排除即可解决:
python manage.py dumpdata > dump.json --exclude=filebrowser.filebrowser
2. 将settings.py的数据源改成支持PostgresSQL
这里略过了PostgresSQL安装过程,计划下次单独写一篇文章。
Sqlite3的数据库连接
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
PostgreSQL的数据库连接
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
3. 初始化Postgres表结构
python3 manage.py migrate --run-syncdb
4. 导入前清空初始数据
这时候导入,会提示数据已存在错误,因为Django在migrate的时候,会存入一些初始数据在ContentType表中,将其清空即可。
python3 manage.py shell
>>> from django.contrib.contenttypes.models import ContentType
>>> ContentType.objects.all().delete()
>>> quit()
5. 导入数据,试一下是不是成功了
python3 manage.py loaddata datadump.json