PostgreSQL JSON字段UTF-8字符转义问题:Psycopg2插入解决方案
解决Psycopg2插入JSON时UTF-8字符被转义的问题
方案1:直接传递Python字典(推荐)
从Psycopg2 2.7版本开始,原生支持将Python字典作为JSON类型参数传递,无需使用Json包装器,可直接避免字符转义问题:
cursor.execute("INSERT INTO my_table (json_data) VALUES (%s)", (data,))
这里的data是你要插入的Python字典对象。
方案2:修改Json类的序列化参数
如果必须使用psycopg2.extras.Json类,可通过自定义dumps函数,将ensure_ascii设为False来禁用ASCII转义:
import json from psycopg2.extras import Json cursor.execute( "INSERT INTO my_table (json_data) VALUES (%s)", (Json(data, dumps=lambda x: json.dumps(x, ensure_ascii=False)),) )
方案3:手动序列化JSON字符串
先将数据序列化为UTF-8编码的JSON字符串(不转义非ASCII字符),再直接插入数据库:
import json json_str = json.dumps(data, ensure_ascii=False) cursor.execute("INSERT INTO my_table (json_data) VALUES (%s)", (json_str,))
问题原因
psycopg2.extras.Json默认使用json.dumps且ensure_ascii=True,会把非ASCII字符(比如ö)转义为\u00f6格式;而pgAdmin插入的是原生UTF-8字符串,因此显示正常。上述方案都是通过调整序列化参数,让非ASCII字符以原生形式存储。
内容的提问来源于stack exchange,提问作者Boris Krassi
相关产品推荐
相关产品推荐

