Django dumpdata在特殊字符上失败

pb3s4cty  于 2023-03-24  发布在  Go
关注(0)|答案(6)|浏览(97)

我试图将整个数据库转储到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.

这是因为我的数据库中有一个字符是特殊字符。我如何正确地转储数据库?
仅供参考,所有其他数据库功能工作正常

7ivaypg9

7ivaypg91#

一种解决方案是使用./manage.py dumpdata -o data.json而不是./manage.py dumpdata > data.json
另一种解决方案是使用Python的UTF-8模式,运行:

python -Xutf8 ./manage.py dumpdata > data.json
ht4b089n

ht4b089n2#

要在django中保存json数据,使用TextIOWrapper:
默认编码现在是locale.getpreferredencoding(False)(...)
locale.getpreferredencoding函数的文档中,我们可以阅读:
根据用户首选项返回用于文本数据的编码。用户首选项在不同系统上的表达方式不同,在某些系统上可能无法通过编程方式提供,因此此函数仅返回猜测值。
Here我发现“黑客”,但工作方法覆盖这些设置:
在django项目的settings.py文件中添加以下行:

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

g0czyy6m3#

以下是来自www.example.com的解决方案djangoproject.com
你去设置有一个“使用Unicode UTF-8的全球语言支持”,框中的“语言”-“管理语言设置”-“更改系统区域设置”-“区域设置”。如果我们应用,并重新启动,然后我们得到一个明智的,现代的,默认的编码从Python。djangoproject.com
设置框如下所示。启用检查并重新启动系统x1c 0d1x

yfwxisqw

yfwxisqw4#

在windows上,我解决我的方法是添加到您的设置

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

运行这在shell上只在windows上

python -Xutf8 manage.py dumpdata --exclude auth.permission --exclude contenttypes > db.json

我真的这么做了成功了

python -Xutf8 manage.py dumpdata -o data.json

但没有显示已安装应用程序的数据

4nkexdtk

4nkexdtk5#

如果你有多个Python环境,在应用解决方法之前,有必要检查一下你是否在正确的环境下发出了python manage.py。这就是我遇到的同样的错误:数据库是在Linux的容器化环境下创建的,Python版本更高,但是Django和其他包也存在于Windows的遗留本地环境中。同样,项目目录作为一个卷附加到容器,内容在本地和容器中是相同的。所以,我只是在本地混合运行manage.py,而不是附加到容器。

tp5buhyn

tp5buhyn6#

“我认为这是目前最好的办法:在目录Python311\Lib\site-packages\django\core\serializers中,打开json.py文件。在json.py文件中,找到以下部分:
类序列化程序(PythonSerializer):
.................
def _init_options(self):
.............
#默认为False
self.json_kwargs.setdefault(“ensure_ascii”,False)
#你将False修复为True
self.json_kwargs.setdefault(“ensure_ascii”,True)
希望这对你们有帮助!

相关问题