Django dumpdata的特殊字符失败

时间:2020-10-21 06:22:07

标签: 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.

这是因为数据库中的一个字符是一个分隔字符。如何正确转储数据库?

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

4 个答案:

答案 0 :(得分:3)

一种解决方案是使用 { 'param': 'value' } 而不是 ./manage.py dumpdata -o data.json

另一种解决方案是使用Python's UTF-8 mode,运行:

./manage.py dumpdata > data.json

答案 1 :(得分:0)

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

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

locale.getpreferredencoding功能的文档中,我们可以read

根据用户喜好返回用于文本数据的编码。用户首选项在不同系统上的表达方式有所不同,在某些系统上可能无法以编程方式提供,因此此功能只会返回一个猜测。

Here我发现“ hacky”但可以覆盖这些设置的有效方法:

在django项目的文件settings.py中添加以下行:

import _locale
_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])

答案 2 :(得分:0)

这是来自 djangoproject.com 的解决方案
您转到“设置”,“语言”-“管理语言设置”-“更改系统区域设置”-“区域设置”中的“使用 Unicode UTF-8 进行全球语言支持”框。 如果我们应用它并重新启动,那么我们会从 Python 中获得一个合理的、现代的、默认的编码。 djangoproject.com

答案 3 :(得分:0)

如果您有多个 Python 环境,在应用变通方法之前,值得检查您是否针对正确的环境发出 python manage.py。这就是我遇到相同错误的情况:数据库是在 Linux 上的容器化环境下创建的,具有更高的 Python 版本,但 Django 和其他包也存在于 Windows 上的旧本地环境中。同样,项目目录作为卷附加到容器,并且内容在本地和容器中是相同的。所以,我只是混在一起在本地运行 manage.py 而不是附加到容器。