KiwiTCMS还原JSON备份文件失败,并显示“安装夹具'-'错误的问题”

问题描述

我一直在使用KiwiTCMS docker镜像安装。最近发生了车祸,机器坏了。我确实有Kiwi docker镜像6.11和相同镜像的备份。

使用以下命令进行备份:

  docker exec -it kiwi_web /Kiwi/manage.py dumpdata --all --indent 2 > database.json

运行KiwiTCMS

docker-compose up -d

现在,当尝试按顺序还原备份时(docker-compose.yml指向正确的kiwi-web映像,sql指向kiwi-db 5.5 mariadb映像),我得到一个错误

# docker-compose up -d
# docker exec -it kiwi_web /Kiwi/manage.py migrate
# cat database.json | docker exec -i kiwi_web /Kiwi/manage.py loaddata --format json -

错误

Traceback (most recent call last):
  File "/venv/lib/python3.6/site-packages/django/db/models/options.py",line 565,in get_field
    return self.fields_map[field_name]
KeyError: 'execution'

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "/venv/lib/python3.6/site-packages/django/core/serializers/json.py",line 69,in Deserializer
    yield from PythonDeserializer(objects,**options)
  File "/venv/lib/python3.6/site-packages/django/core/serializers/python.py",line 118,in Deserializer
    field = Model._Meta.get_field(field_name)
  File "/venv/lib/python3.6/site-packages/django/db/models/options.py",line 567,in get_field
    raise FieldDoesNotExist("%s has no field named '%s'" % (self.object_name,field_name))
django.core.exceptions.FieldDoesNotExist: LinkReference has no field named 'execution'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Kiwi/manage.py",line 12,in <module>
    execute_from_command_line(sys.argv)
  File "/venv/lib/python3.6/site-packages/django/core/management/__init__.py",line 381,in execute_from_command_line
    utility.execute()
  File "/venv/lib/python3.6/site-packages/django/core/management/__init__.py",line 375,in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/venv/lib/python3.6/site-packages/django/core/management/base.py",line 323,in run_from_argv
    self.execute(*args,**cmd_options)
  File "/venv/lib/python3.6/site-packages/django/core/management/base.py",line 364,in execute
    output = self.handle(*args,**options)
  File "/venv/lib/python3.6/site-packages/django/core/management/commands/loaddata.py",line 72,in handle
    self.loaddata(fixture_labels)
  File "/venv/lib/python3.6/site-packages/django/core/management/commands/loaddata.py",line 114,in loaddata
    self.load_label(fixture_label)
  File "/venv/lib/python3.6/site-packages/django/core/management/commands/loaddata.py",line 172,in load_label
    for obj in objects:
  File "/venv/lib/python3.6/site-packages/django/core/serializers/json.py",line 73,in Deserializer
    raise DeserializationError() from exc
django.core.serializers.base.DeserializationError: Problem installing fixture '-': 

我如何继续以某种方式保存备份的数据?

非常感谢你, -米卡

解决方法

FieldDoesNotExist:LinkReference没有名为“执行”的字段

这告诉您您的错误是什么!您正在尝试将数据库转储从版本6.11还原到更高版本,但这将无法正常工作,因为与此同时数据库架构中发生了[可能多个]更改。

docker-compose.yml指向正确的猕猴桃网络图像

显然不是这种情况,因为LinkReference.execution字段出现在7.0版中,请参见https://kiwitcms.readthedocs.io/en/latest/changelog.html#id108

所以回顾一下:

  • 您正在尝试在应用服务器运行不兼容版本时从较旧(或更新)的Kiwi TCMS版本恢复数据库转储。这是行不通的。
  • 确保您的docker-compose.yml使用的是Kiwi TCMS v6.11,而不是latest

您的选择:

  • 找出哪些字段已更改(您的json转储来自哪个版本),并修改JSON结构以使其匹配-既费时又容易出错
  • 获取与Kiwi TCMS完全相同的旧版本,然后将数据还原到其中。