Я использую панды и экспортирую данные в формате json следующим образом:
import pandas as pd
df = pd.DataFrame({'a': ['Têst']})
df.to_json(orient='records', lines=True)
> u'{"a":"T\\u00east"}'
Это имеет смысл, поскольку у нас есть символ Unicode 00ea
с префиксом \u
и экранированный с \
при преобразовании в JSON
Но затем я импортирую строки JSON в Postgres с COPY
buffer = cStringIO.StringIO()
buffer.write(df.to_json(orient='records', lines=True))
buffer.seek(0)
with connection.cursor() as cursor:
cursor.copy_expert(sql="""
COPY tmp (json_data) FROM STDIN WITH NULL AS '' ENCODING 'UTF8';
""", file=buffer)
Проблема в том, что результат в базе данных в итоге равен
{"a": "Tu00east"}
и как вы можете видеть, двойник \\
исчез.
Я пытался использовать CSV
в качестве режима COPY, но он все портит, поскольку в некоторых данных присутствуют запятые, и попытка установить символ ESCAPE и DELIMITER на что-то другое всегда вызывает сбои.
Столбец таблицы имеет тип jsonb
. В документации я прочитал, что PG не нравится Unicode не ASCII вместо \ x003f, если только кодировка DB не UTF8, как в моем случае, так что это не должно быть проблемой.
Я пытаюсь выяснить, почему здесь удаляются экранирующие символы, и как импортировать их в Postgres и сохранить кодировку.