Postgresql Json 列不保存 utf-8 字符
Postgresql Json column not saving utf-8 character
您好,我正在尝试使用 sqlalchemy 和 python 请求将我从 api 获得的数据保存到我的 postgresql 中的 Json 列中。
r = requests.get(api)
content = r.content
data = json.loads(content)
crawl_item = {}
crawl_item = session.query(CrawlItem).filter_by(site_id=3, href=list_id).first()
crawl_item.description = data['ad']['body']
crawl_item.meta_data = {}
crawl_item.meta_data["ward"] = data['ad_params']['ward']['value']
try:
session.commit()
except:
session.rollback()
raise
finally:
ret_id = crawl_item.id
session.close()
我的模特:
class CrawlItem(Base):
...
description = Column(Text)
meta_data = Column(postgresql.JSON)
我想获取病房的价值:
"ward": {
"id": "ward",
"value": "Thị trấn Trạm Trôi",
"label": " Phường, thị xã, thị trấn"
}
我已经将我的 postgresql 编码为 utf-8,所以其他不是 json 列 (description = Column(Text)
) 的字段通常只保存 utf-8 字符,只有我的 json 列数据不是解码:
{
"ward":"Th\u1ecb tr\u1ea5n Tr\u1ea1m Tr\u00f4i"
}
描述栏:
meta_data列:
我试过使用:
crawl_item.meta_data["ward"] = data['ad_params']['ward']['value'].decode('utf-8')
但是病房数据没有得到保存
我不知道哪里出了问题,希望有人能帮助我
编辑:
我用psql检查了数据,得到了这些:
描述栏:
meta_data列:
似乎只有 meta_data json 列的字符有问题
Sqlalchemy 在保存到数据库之前序列化 JSON 字段(参见 url and url and url)。
json_serializer = dialect._json_serializer or json.dumps
默认情况下,PostgreSQL 方言使用 json.dumps
和 json.loads
。
当您使用文本列时,数据按以下流程转换:
str -> bytes in utf-8 encoding
当您使用 PostgreSQL 方言的 JSON 列时,数据按以下流程转换:
dict -> str with escaped non-ascii symbols -> bytes in utf-8 encoding
You can override the serializer in your engine configuration using json_serializer
field:
json_serializer=partial(json.dumps, ensure_ascii=False)
为您的 json 列使用“jsonb”数据类型或将“meta_data”字段转换为“jsonb”,如下所示:
select meta_data::jsonb from your_table;
您好,我正在尝试使用 sqlalchemy 和 python 请求将我从 api 获得的数据保存到我的 postgresql 中的 Json 列中。
r = requests.get(api)
content = r.content
data = json.loads(content)
crawl_item = {}
crawl_item = session.query(CrawlItem).filter_by(site_id=3, href=list_id).first()
crawl_item.description = data['ad']['body']
crawl_item.meta_data = {}
crawl_item.meta_data["ward"] = data['ad_params']['ward']['value']
try:
session.commit()
except:
session.rollback()
raise
finally:
ret_id = crawl_item.id
session.close()
我的模特:
class CrawlItem(Base):
...
description = Column(Text)
meta_data = Column(postgresql.JSON)
我想获取病房的价值:
"ward": {
"id": "ward",
"value": "Thị trấn Trạm Trôi",
"label": " Phường, thị xã, thị trấn"
}
我已经将我的 postgresql 编码为 utf-8,所以其他不是 json 列 (description = Column(Text)
) 的字段通常只保存 utf-8 字符,只有我的 json 列数据不是解码:
{
"ward":"Th\u1ecb tr\u1ea5n Tr\u1ea1m Tr\u00f4i"
}
描述栏:
meta_data列:
我试过使用:
crawl_item.meta_data["ward"] = data['ad_params']['ward']['value'].decode('utf-8')
但是病房数据没有得到保存
我不知道哪里出了问题,希望有人能帮助我
编辑:
我用psql检查了数据,得到了这些:
描述栏:
meta_data列:
似乎只有 meta_data json 列的字符有问题
Sqlalchemy 在保存到数据库之前序列化 JSON 字段(参见 url and url and url)。
json_serializer = dialect._json_serializer or json.dumps
默认情况下,PostgreSQL 方言使用 json.dumps
和 json.loads
。
当您使用文本列时,数据按以下流程转换:
str -> bytes in utf-8 encoding
当您使用 PostgreSQL 方言的 JSON 列时,数据按以下流程转换:
dict -> str with escaped non-ascii symbols -> bytes in utf-8 encoding
You can override the serializer in your engine configuration using
json_serializer
field:
json_serializer=partial(json.dumps, ensure_ascii=False)
为您的 json 列使用“jsonb”数据类型或将“meta_data”字段转换为“jsonb”,如下所示:
select meta_data::jsonb from your_table;