Django dumpdata 在特殊字符上失败

GEV*_*GEV 7 python django

我正在尝试将我的整个数据库转储到 json。当我运行时,python manage.py dumpdata > data.json我收到一个错误:

(env) PS C:\dev\watch_something> python manage.py dumpdata > data.json
CommandError: Unable to serialize database: 'charmap' codec can't encode character '\u0130' in position 1: character maps to <undefined>
Exception ignored in: <generator object cursor_iter at 0x0460C140>
Traceback (most recent call last):
  File "C:\dev\watch_something\env\lib\site-packages\django\db\models\sql\compiler.py", line 1602, in cursor_iter
    cursor.close()
sqlite3.ProgrammingError: Cannot operate on a closed database.
Run Code Online (Sandbox Code Playgroud)

这是因为我的数据库中的一个角色是特殊角色。如何正确转储数据库?

仅供参考,所有其他数据库功能都可以正常工作

Jul*_*ard 10

一种解决方案是使用./manage.py dumpdata -o data.json代替./manage.py dumpdata > data.json.

另一种解决方案是使用Python 的 UTF-8 模式,运行:

python -Xutf8 ./manage.py dumpdata > data.json
Run Code Online (Sandbox Code Playgroud)

  • 在 Windows 上,使用 python -Xutf8 manage.py dumpdata -o data.json 有效。否则,如果没有“-Xutf8”选项,就会失败。 (7认同)
  • 确实有效,非常感谢 (3认同)

小智 8

json在 Django 中保存数据,使用TextIOWrapper

默认编码现在是locale.getpreferredencoding(False)(...)

locale.getpreferredencoding功能文档中,我们可以阅读

根据用户偏好返回用于文本数据的编码。用户偏好在不同系统上的表达方式不同,并且在某些系统上可能无法以编程方式使用,因此此函数仅返回猜测值。

在这里,我发现了“hacky”但可以覆盖这些设置的工作方法:

settings.pydjango 项目的文件中添加以下几行:

import _locale
_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])
Run Code Online (Sandbox Code Playgroud)

  • 如果有人偶然发现这一点,请注意,语法“python manage.py dumpdata &gt; Giveme.json”可能仍然会因该解决方案而失败,但在我的情况下,“python manage.py dumpdata -o pleasegiveme.json”与hacky解决方案以上确实有效。 (8认同)