代码之家  ›  专栏  ›  技术社区  ›  Epcylon

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

  •  17
  • Epcylon  · 技术社区  · 14 年前

    我目前正在使用sqlite3作为Django项目的DB。我想将此更改为使用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"
    
    • 这不是将数据从一个数据库移动到另一个数据库的正确方法吗?
    3 回复  |  直到 14 年前
        1
  •  35
  •   Daniel Roseman    14 年前

    问题很简单,你得到的内容类型定义了两次-一次当你这样做 syncdb ,然后从您尝试导入的导出数据中。由于数据库中可能有其他依赖于原始内容类型定义的项,因此我建议保留这些项。

    所以,跑步之后 ,做 manage.py dbshell TRUNCATE django_content_type; 删除所有新定义的内容类型。那么你就不应该有任何冲突-在这一部分的过程中,在任何情况下。

        2
  •  2
  •   ogai    13 年前

    网上有一场关于它的大讨论 Django ticket 7052 . 现在正确的方法是使用 --natural 参数,示例: ./manage.py dumpdata --natural --format=xml --indent=2 > fixture.xml

    为了 natural_key get_by_natural_key the Django documentation regarding natural keys .

    尽管如此,您可能仍然需要在导入数据之前对其进行编辑 ./manage.py loaddata . 例如,如果你的应用程序改变了, syncdb django_content_type 在加载xml文件之前,您可能需要从xml文件中删除相应的条目。

        3
  •  0
  •   dieb    8 年前

    这对我有用。您可能希望确保服务器已停止,因此不会丢失新数据。甩了它:

    $ python manage.py dumpdata --exclude auth.permission --exclude contenttypes --natural > db.json
    

    确保您的模型没有信号(如保存后)或任何创建模型的东西。如果你这样做了,马上评论一下。

    $ python manage.py syncdb
    
    $ python manage.py migrate
    

    加载数据:

    ./manage.py loaddata db.json
    
    推荐文章