当前位置:  开发笔记 > 编程语言 > 正文

加载datadump时,将Django项目从sqlite3后端切换到postgresql failes

如何解决《加载datadump时,将Django项目从sqlite3后端切换到postgresqlfailes》经验,为你挑选了1个好方法。

我目前正在使用sqlite3作为我的一个Django项目的数据库.我想改变它以使用postgresql,我想保持所有数据完好无损.

我曾经./manage.py dumpdata > dump.json创建过数据转储,并将我的设置更改为使用postgresql.首先尝试使用空数据库./manage.py loaddata dump.json导致表中存在错误,因此我运行了./manage.py syncdb,然后再次尝试.这导致了这个错误:

Problem installing fixture 'dump.json': Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/django/core/management/commands/loaddata.py", line 163, in handle
    obj.save()
  File "/usr/lib/python2.6/site-packages/django/core/serializers/base.py", line 163, in save
    models.Model.save_base(self.object, raw=True)
  File "/usr/lib/python2.6/site-packages/django/db/models/base.py", line 495, in save_base
    rows = manager.filter(pk=pk_val)._update(values)
  File "/usr/lib/python2.6/site-packages/django/db/models/query.py", line 448, in _update
    return query.execute_sql(None)
  File "/usr/lib/python2.6/site-packages/django/db/models/sql/subqueries.py", line 124, in execute_sql
    cursor = super(UpdateQuery, self).execute_sql(result_type)
  File "/usr/lib/python2.6/site-packages/django/db/models/sql/query.py", line 2347, in execute_sql
    cursor.execute(sql, params)
  File "/usr/lib/python2.6/site-packages/django/db/backends/util.py", line 19, in execute
    return self.cursor.execute(sql, params)
IntegrityError: duplicate key value violates unique constraint "django_content_type_app_label_key"

这不是将数据从一个数据库移动到另一个数据库的正确方法吗?

为了安全地切换DB后端,我应该怎么做?

Daniel Rosem.. 33

问题只是你得到的内容类型定义了两次 - 一次是你做的syncdb,一次是你想要导入的导出数据.由于您的数据库中可能还有其他依赖于原始内容类型定义的项目,因此我建议您保留这些项目.

因此,在运行之后syncdb,manage.py dbshell在数据库中执行TRUNCATE django_content_type;以及删除所有新定义的内容类型.那么你不应该在这个过程的任何部分发生任何冲突.



1> Daniel Rosem..:

问题只是你得到的内容类型定义了两次 - 一次是你做的syncdb,一次是你想要导入的导出数据.由于您的数据库中可能还有其他依赖于原始内容类型定义的项目,因此我建议您保留这些项目.

因此,在运行之后syncdb,manage.py dbshell在数据库中执行TRUNCATE django_content_type;以及删除所有新定义的内容类型.那么你不应该在这个过程的任何部分发生任何冲突.


在我的例子中,postgres抱怨由于外键约束而无法执行截断,并建议添加CASCADE参数,该参数有效.所以:"TRUNCATE django_content_type CASCADE;"
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有