为了账号安全,请及时绑定邮箱和手机立即绑定

Django dumpdata 在特殊字符上失败

Django dumpdata 在特殊字符上失败

慕码人2483693 2023-12-12 21:05:27
我正在尝试将整个数据库转储为 json。当我运行时python manage.py dumpdata > data.json出现错误:(env) PS C:\dev\watch_something> python manage.py dumpdata > data.jsonCommandError: 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.这是因为我的数据库中的字符之一是特殊字符。如何正确转储数据库?仅供参考,所有其他数据库功能都工作正常
查看完整描述

5 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

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

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

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


查看完整回答
反对 回复 2023-12-12
?
千巷猫影

TA贡献1829条经验 获得超7个赞

为了json在 django 中保存数据,使用了TextIOWrapper :

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

在功能文档中locale.getpreferredencoding我们可以读到:

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

“hacky”但覆盖这些设置的工作方法:

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

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


查看完整回答
反对 回复 2023-12-12
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

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

设置框看起来像这样。启用检查并重新启动系统

https://img1.sycdn.imooc.com/65785ac90001d31104310223.jpg

查看完整回答
反对 回复 2023-12-12
?
湖上湖

TA贡献2003条经验 获得超2个赞

在Windows上我解决我的问题的方法是添加到你的设置

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

仅在 Windows 上的 shell 上运行

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

我实际上这样做了它有效

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

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


查看完整回答
反对 回复 2023-12-12
?
智慧大石

TA贡献1946条经验 获得超3个赞

如果您有多个 Python 环境,那么在应用解决方法之前,值得检查您的问题是否python manage.py针对正确的环境。在我的例子中,我遇到了同样的错误:数据库是在 Linux 上的容器化环境下创建的,具有较高的 Python 版本,但 Django 和其他包也存在于 Windows 上的旧本地环境中。此外,项目目录作为卷附加到容器,并且内容在本地和容器中是相同的。所以,我只是混合并manage.py在本地运行,而不是附加到容器上。



查看完整回答
反对 回复 2023-12-12
  • 5 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信