问题
我有一个空的(迁移的)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
命令失败并显示IntegrityError
:Key ... already exists
。
我在加载数据之前尝试删除所有ContentType
模型对象,这样它就不会抱怨重复键。虽然这在使用sqlite数据库时有效,但在postgres数据库上失败并且IntegrityError
Key (id)=(1) is still referenced from table "wagtailcore_page".
已使用的版本
相关
答案 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数据库进行了一次测试,并且运行良好。