首页 > 解决方案 > KiwiTCMS 恢复 json 备份文件失败,并出现“问题安装夹具 '-' 错误”

问题描述

我一直在使用 KiwiTCMS docker 镜像安装。最近发生了车祸,机器坏了。我确实有 Kiwi docker image 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 '-': 

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

非常感谢,-米卡

标签: kiwi-tcms

解决方案


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

好吧,这告诉你你的错误是什么!您正在尝试将数据库转储从 6.11 版本恢复到更高版本,这将无法正常工作,因为同时数据库架构中存在 [可能多次] 更改。

docker-compose.yml 指向正确的 kiwi-web 图像

显然不是这种情况,因为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,然后将数据恢复到上面。

推荐阅读