【问题标题】:Django fails to loaddata with deserialization errorDjango 无法加载数据并出现反序列化错误
【发布时间】:2020-06-22 18:30:30
【问题描述】:

我正在运行在 django 上运行的 Wagtail,并且在运行 dumpdata 时会发生以下情况

python manage.py dumpdata --indent 2 --output dumps.json
CommandError: Unable to serialize database: no such table: wagtailimages_uploadedimage

之后,我删除了 sqlite 数据库并从应用程序migrations 目录中删除了迁移,这样我就可以拥有一个空数据库并测试转储的数据。运行migrate 后我执行loaddata dump1.json 并出现以下错误

Tracking file by folder pattern:  migrations
Traceback (most recent call last):
  File "/home/user/Desktop/projects/mytestwebapp/venv/lib/python3.8/site-packages/django/core/serializers/json.py", line 68, in Deserializer
    objects = json.loads(stream_or_string)
  File "/usr/lib/python3.8/json/__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.8/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.8/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

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

Traceback (most recent call last):
  File "/opt/pycharm-professional/plugins/python/helpers/pycharm/django_manage.py", line 52, in <module>
    run_command()
  File "/opt/pycharm-professional/plugins/python/helpers/pycharm/django_manage.py", line 46, in run_command
    run_module(manage_file, None, '__main__', True)
  File "/usr/lib/python3.8/runpy.py", line 207, in run_module
    return _run_module_code(code, init_globals, run_name, mod_spec)
  File "/usr/lib/python3.8/runpy.py", line 97, in _run_module_code
    _run_code(code, mod_globals, init_globals,
  File "/usr/lib/python3.8/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "/home/user/Desktop/projects/mytestwebapp/manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/user/Desktop/projects/mytestwebapp/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/home/user/Desktop/projects/mytestwebapp/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/user/Desktop/projects/mytestwebapp/venv/lib/python3.8/site-packages/django/core/management/base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/user/Desktop/projects/mytestwebapp/venv/lib/python3.8/site-packages/django/core/management/base.py", line 364, in execute
    output = self.handle(*args, **options)
  File "/home/user/Desktop/projects/mytestwebapp/venv/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 72, in handle
    self.loaddata(fixture_labels)
  File "/home/user/Desktop/projects/mytestwebapp/venv/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 114, in loaddata
    self.load_label(fixture_label)
  File "/home/user/Desktop/projects/mytestwebapp/venv/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 172, in load_label
    for obj in objects:
  File "/home/user/Desktop/projects/mytestwebapp/venv/lib/python3.8/site-packages/django/core/serializers/json.py", line 73, in Deserializer
    raise DeserializationError() from exc
django.core.serializers.base.DeserializationError: Problem installing fixture '/home/user/Desktop/projects/mytestwebapp/dump1.json': 

我还尝试使用以下方法排除一些我在倾倒时不需要的东西

dumpdata --natural-foreign --indent 2 -e contenttypes -e auth.permission -e wagtailcore.groupcollectionpermission -e wagtailcore.grouppagepermission -e wagtailimages.rendition -e sessions > dump1.json

但它没有任何区别。

该应用程序是一个简单的博客,遵循here 所示的演示。

【问题讨论】:

  • 灯具的名称是data.json 还是dump1.json?您在问题中使用了这两个名称
  • 抱歉造成混淆,只是从终端复制了命令,并没有意识到它有不同的名称。您可以认为灯具名称相同,因为它没有任何区别。为了保持一致性,我在问题中重命名了它

标签: python django wagtail


【解决方案1】:

使用--output 而不是&gt; 以避免向您转储的数据发送控制台(stdout)调试信息,同时排除不相关的模型

python manage.py dumpdata --natural-foreign --indent 2 -e contenttypes -e auth.permission -e wagtailcore.groupcollectionpermission -e wagtailcore.grouppagepermission -e wagtailimages.rendition -e sessions -e wagtailimages.uploadedimage --output dumps.json

【讨论】:

  • 它没有用。我还用错误输出更新了这个问题,奇怪的是,每次执行转储数据时都不会出现这种错误输出。错误是Unable to serialize database: no such table: wagtailimages_uploadedimage
  • @kampias 不知道,我在我的网站上使用了上述命令,它工作正常,我通常在应用程序级别使用此命令,而不是整个网站。比如产品app,我用:python manage.py dumpdata product --indent 2 --output product.json,你能测试一下单app能不能用吗?还测试exclude 是否有效...-e wagtailimages.uploadedimage?
  • 是的,它奏效了。最初我自己尝试了-e wagtailimages.uploadedimage,但出现了更多错误。最后一个有效的命令是:dumpdata --natural-foreign --indent 2 -e contenttypes -e auth.permission -e wagtailcore.groupcollectionpermission -e wagtailcore.grouppagepermission -e wagtailimages.rendition -e sessions -e wagtailimages.uploadedimage --output dumps.json 稍后我能够使用loaddata 恢复数据库。如果您愿意,请在上方编辑您的答案,以便我接受
【解决方案2】:

根据您的输出,转储的数据是空的,因此会引发以下错误。

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

转储数据的方法:

  1. 通过删除您的 sqlite 数据库文件来删除您的数据库
  2. 删除您的迁移文件夹
  3. python manage.py makemigrations
  4. python manage.py migrate
  5. 尝试通过创建用户或其他数据添加一些示例数据
  6. 再次运行转储数据python manage.py dumpdata -output my_dumps.json

然后,检查 my_dumps.json 文件,如果里面有一些数据,那么你可以尝试使用加载数据 python manage.py loaddata my_dumps.json

【讨论】:

  • 转储的数据不为空。经检查dump1.json包含大量数据
猜你喜欢
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 2012-08-16
  • 2021-04-08
  • 1970-01-01
  • 2011-04-12
相关资源
最近更新 更多