恢复 Django 转储
Restoring Django dump
我已经 运行 每天转储生产 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,但这以前从来没有出现过问题。
在您的本地计算机上克隆您的项目并执行如下操作:
- 签出用于创建转储的项目。
- 创建新的数据库和表。
- 加载转储。
- 将代码更新为当前状态。
- 运行 迁移。
那是相当痛苦的。似乎解决它的方法是从生产 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 table 中条目的 ID 设置为与转储中的条目 ID 相匹配的效果,从而允许恢复继续进行。
我已经 运行 每天转储生产 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,但这以前从来没有出现过问题。
在您的本地计算机上克隆您的项目并执行如下操作:
- 签出用于创建转储的项目。
- 创建新的数据库和表。
- 加载转储。
- 将代码更新为当前状态。
- 运行 迁移。
那是相当痛苦的。似乎解决它的方法是从生产 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 table 中条目的 ID 设置为与转储中的条目 ID 相匹配的效果,从而允许恢复继续进行。