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

将 json 导入 Postgres 时的编码问题

将 json 导入 Postgres 时的编码问题

泛舟湖上清波郎朗 2021-08-05 16:22:57
我正在使用熊猫,并将数据导出为 json,如下所示:import pandas as pddf = pd.DataFrame({'a': ['Têst']})df.to_json(orient='records', lines=True)> u'{"a":"T\\u00east"}'这是有道理的,因为我们有一个00ea前缀为 的 Unicode 字符,\u并且\在转换为 JSON 时会转义为但是然后我将 JSON 字符串导入到 Postgres 中 COPYbuffer = 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"}正如你所看到的那样,双人\\消失了。我尝试使用CSVCOPY 模式,但由于某些数据中有逗号,因此将事情搞砸了,并且尝试将 ESCAPE 字符和 DELIMITER 设置为其他内容似乎总是会导致失败。表列有一个jsonb类型。我在文档中读到 PG 不喜欢 \x003f 上的非 ASCII Unicode,除非 DB 编码是 UTF8,在我的情况下,这应该不是问题。我想弄清楚为什么这里要删除转义字符,以及如何导入 Postgres 并保存编码。
查看完整描述

1 回答

?
PIPIONE

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

将 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)


查看完整回答
反对 回复 2021-08-05
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

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