恢复Django转储

时间:2015-02-01 17:51:23

标签: django backup

我一直在运行生产Django应用程序的每日转储,如下所示:

 ./manage.py dumpdata  --exclude=contenttypes --exclude=auth.Permission -e sessions -e admin --all > data.json

通常情况下,将其还原到另一个用于开发的安装并没有造成问题,但最近尝试恢复数据导致了这一点:

 ./manage.py loaddata -i data.json
 django.db.utils.IntegrityError: Problem installing fixtures: The row in table 'reversion_version' with primary key '1' has an invalid foreign key: reversion_version.content_type_id contains a value '14' that does not have a corresponding value in django_content_type.id.

这告诉我这个问题是由最近添加django-reversion导致代码库引起的,但我不确定为什么我无法找到任何导入备份的方法。一些帖子建议使用自然键可能有效,但后来我得到错误:

django.core.serializers.base.DeserializationError: Problem installing fixture 'data.json': [u"'maintainer' value must be an integer."]
在这种情况下,“maintainer”是models.py中模型定义中对这段代码的引用:

maintainer = models.ForeignKey(Organization,related_name="maintainer",blank=True,null=True)

有没有人对如何安装此转储有任何建议,或修改转储过程以进行可重现的转储?

我注意到生产站点正在使用Postgres,测试站点有SQLite,但这在以前从未出现过问题。

2 个答案:

答案 0 :(得分:1)

在本地计算机上克隆项目并执行以下操作:

  1. 以用于创建转储的状态签出项目。
  2. 创建新的数据库和表格。
  3. 加载转储。
  4. 将代码更新为当前状态。
  5. 运行迁移。

答案 1 :(得分:0)

那真是太痛苦了。似乎修复它的方法是从生产posgres数据库转储django_content_types作为csv,从生成的csv文件中删除ID,然后在SQLite数据库上为测试版本执行以下操作:

 CREATE TABLE temp_table(a, b, c)
 .mode csv
 .import content_type.csv temp_table
 DELETE FROM sqlite_sequence WHERE name = 'django_content_type'
 DELETE FROM django_content_type
 INSERT INTO django_content_type(name,app_label,model) SELECT * FROM temp_table

这样可以设置django_content_type表中条目的id与转储中的条目匹配,从而允许还原继续进行。