Wagtail将sqlite移动到postgres数据库

时间:2018-01-07 22:03:51

标签: python django postgresql sqlite wagtail

问题

我有一个空的(迁移的)postgres数据库,我想从我的sqlite数据库中移动数据。

我尝试了什么

  • 我用

    导出
    ./manage.py dumpdata --exclude auth.permission --exclude contenttypes --natural-foreign
    

    并使用./manage.py loaddata将数据加载到postgres数据库中。

    这里的问题是wagtail需要contenttypes并且我得到运行时错误

    FooPage matching query does not exist. 
    

    /wagtail/wagtailcore/models.py:639 
    return content_type.get_object_for_this_type(id=self.id)
    
  • 不要将contenttypes排除在dumpdata之外。现在,loaddata命令失败并显示IntegrityErrorKey ... already exists

  • 我在加载数据之前尝试删除所有ContentType模型对象,这样它就不会抱怨重复键。虽然这在使用sqlite数据库时有效,但在postgres数据库上失败并且IntegrityError

    Key (id)=(1) is still referenced from table "wagtailcore_page".
    

已使用的版本

  • django 1.11.9
  • wagtail 1.12.3
  • python 3.5

相关

Problems with contenttypes when loading a fixture in Django

2 个答案:

答案 0 :(得分:0)

当我将Wagtail网站从sqlite移到Postgres时,我做了一些事情,所以只提供参考。

我以this website为基础,但是由于外键问题而无法立即删除ContentType对象时遇到错误,如下所示:

  

django.db.utils.IntegrityError:对表“ wagtailcore_page”进行插入或更新违反了外键约束“ wagtailcore_page_content_type_id_c28424df_fk_django_co”

     

详细信息:表“ django_content_type”中不存在键(content_type_id)=(1)。

似乎是由于Wagtail页面对象所致,因此首先在Django shell中执行以下两行。然后可以按照该页面上的其余说明执行ContentType删除和导入。

from wagtail.core.models import Page
Page.objects.all().delete()

答案 1 :(得分:0)

使用pgloader,您可以执行命令指令以将数据从SQLite加载到Postgres。

通过Homebrew在OSX上安装:

brew install pgloader

创建一个脚本文件。例如migrate.script

load database
     from sqlite:///path/to/db.sqlite3
     into postgresql:///yourpostgresdbname

 with include drop, create tables, create indexes, reset sequences

  set work_mem to '16MB', maintenance_work_mem to '512 MB';

运行它:

pgloader migrate.script

我使用包含最小的Wagtail项目(某些页面,修订和图像)的SQLite数据库进行了一次测试,并且运行良好。