проблема с кодировкой при импорте json в Postgres - PullRequest
0 голосов
/ 02 ноября 2018

Я использую панды и экспортирую данные в формате 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 и сохранить кодировку.

1 Ответ

0 голосов
/ 02 ноября 2018

Используйте параметр csv для COPY, с DELIMITER e'\x01' QUOTE e'\x02'. Я не уверен, работает ли это для всех возможных допустимых JSON, но у меня никогда не было сбоев.

$ psql -X testdb -c 'create table t(d jsonb)'
CREATE TABLE
$ cat foo.json
{"a":"Têst"}
$ cat foo.json | psql -X testdb -c "COPY t from stdin csv delimiter e'\x01' quote e'\x02'" 
COPY 1
$ psql -X testdb -c 'select * from t';                                                    
       d       
---------------
 {"a": "Têst"}
(1 row)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...