Pergunta

Existe uma maneira fácil de despejar UTF-8 dados de um banco de dados?

Eu conheço este comando:

manage.py dumpdata > mydata.json

Mas os dados que obtive no arquivo mydata.json, os dados Unicode se parecem:

"name": "\u4e1c\u6cf0\u9999\u6e2f\u4e94\u91d1\u6709\u9650\u516c\u53f8"

Eu gostaria de ver uma string unicode real como 全球卫星定位系统 (Chinês).

Foi útil?

Solução

django-admin.py dumpdata seupp poderia despejar para esse fim.

Ou se você usar o MySQL, poderá usar o mysqldump comando para despejar todo o banco de dados.

E este tópico tem muitas maneiras de despejar dados, incluindo métodos manuais.

ATUALIZAR: Porque o OP editou a pergunta.

Para converter da String de codificação JSON em string legível por humanos, você pode usar isso:

open("mydata-new.json","wb").write(open("mydata.json").read().decode("unicode_escape").encode("utf8"))

Outras dicas

Depois de lutar com problemas semelhantes, acabei de descobrir que o XML Formatter lida com o UTF8 corretamente.

manage.py dumpdata --format=xml > output.xml

Eu tive que transferir dados do Django 0,96 para o Django 1.3. Após inúmeras tentativas com dados de despejo/carga, finalmente consegui usar o XML. Sem efeitos colaterais por enquanto.

Espero que isso ajude alguém, como eu aterrissei neste tópico ao procurar uma solução.

Você precisa encontrar a chamada para json.dump*() no código do django e passe a opção adicional ensure_ascii=False e depois codifique o resultado depois, ou você precisa usar json.load*() para carregar o JSON e depois despejá -lo com essa opção.

Aqui eu escrevi um trecho para isso. Funciona para mim!

import codecs
src = "/categories.json"
dst = "/categories-new.json"
source = codecs.open(src, 'r').read().decode('string-escape')
codecs.open(dst, "wb").write(source)

Você pode criar seu próprio serializador que passa ensure_ascii=False argumento para json.dumps função:

# serfializers/json_no_uescape.py
from django.core.serializers.json import *


class Serializer(Serializer):

    def _init_options(self):
        super(Serializer, self)._init_options()
        self.json_kwargs['ensure_ascii'] = False

Em seguida, registre um novo serializador (por exemplo em seu aplicativo __init__.py Arquivo):

from django.core.serializers import register_serializer

register_serializer('json-no-uescape', 'serializers.json_no_uescape')

Então você pode correr:

manage.py dumpdata --format=json-no-uescape > output.json

Apenas deixe aqui:

./manage.py dumpdata --indent=2 core.item | python3 -c "import sys; sys.stdout.write(sys.stdin.read().encode().decode('unicode_escape'))" > core/fixtures/item.json
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top