我需要将一个复杂的项目从sqlite迁移到PostgreSQL。很多人似乎会遇到外键、数据截断等问题...
- 是否有完全自动化的工具可用?
- 在迁移之前,我需要检查一些数据或模式吗?
编辑:我尝试过django-command-extensions的DumpScript,但它在我的2GB RAM PC上无法运行我的当前数据集。
我需要将一个复杂的项目从sqlite迁移到PostgreSQL。很多人似乎会遇到外键、数据截断等问题...
编辑:我尝试过django-command-extensions的DumpScript,但它在我的2GB RAM PC上无法运行我的当前数据集。
根据我的经验,使用SQL导入和导出不起作用。
相反,您应该按照以下顺序进行:
1. 将数据库内容转储为JSON格式
$ ./manage.py dumpdata > dump.json
2. 在settings.py中切换后端
DATABASES = {
# COMMENT OUT:
# 'default': dj_database_url.config(default='sqlite:////full/path/to/your/database/file.sqlite'),
# ADD THIS INSTEAD:
'default': dj_database_url.config(default='postgres://localhost:5432/postgres_db_name'),
}
3. 同步并迁移新数据库到相同的表结构
$ ./manage.py syncdb
$ ./manage.py migrate
4. 将JSON加载到新数据库中。
$ ./manage.py loaddata dump.json
5. 恭喜!现在新数据已经存储到您的Postgres数据库中。
./manage.py dumpdata --natural-primary --natural-foreign > dump.json
settings.py
中的 DATABASES
更改为指向新的(PostgreSQL)数据库。./manage.py migrate
./manage.py loaddata dump.json
CharField
的最大长度限制。在我的情况下,这使得 loaddata
步骤失败。我能够通过以下方式找到(并删除)具有过长 CharField
值的模型实例:MyModel.objects.extra(where=["LENGTH(text) > 20"]).delete()
在执行上述步骤1之前,我曾经做过这件事,然后一切正常。
dumpdata > dump.json
是行不通的。 - sgauri我从未尝试过这样做,但我会尝试以下步骤:
python manage.py migrate
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
queryset = MyModel.objects.using("old-db").all()
for obj in queryset:
obj.save(using="new-db")
因为这样可以保留主键,所以我认为不会出现任何外键问题。
gem install sequel
gem install pg sqlite3
在PostgreSQL上创建一个空数据库,比如说testDB,并给一个用户分配授权许可。
从命令提示符中运行以下命令:
sequel -C sqlite:///path/to/sqlitedb.db postgres://user:password@host/testDB
这段代码将不会出现错误。
更改您的Django项目设置以适用于Postgres数据库。
运行:
./manage migrate (非必须)
启动服务器。
sqlite3 sqllitedb .dump | psql postgresdb
dumpdata --natural-primary --natural-foreign
可以避免这个问题,我会把它加入到答案中。 - damio