Столбец Postgresql Json не сохраняет символ utf-8 - PullRequest
0 голосов
/ 18 октября 2019

Привет, я пытаюсь сохранить данные, полученные из этого api , в мой столбец Json в моем postgresql, используя запросы sqlalchemy и python.

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:

"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 не декодируются:

enter image description here

{ 
   "ward":"Th\u1ecb tr\u1ea5n Tr\u1ea1m Tr\u00f4i"
}

столбец описания:

description

столбец метаданных:

meta_data

Я пытался использовать:

crawl_item.meta_data["ward"] = data['ad_params']['ward']['value'].decode('utf-8')

, ноданные прихода не сохраняются

Понятия не имею, что не так, надеюсь, кто-нибудь мне поможет

РЕДАКТИРОВАТЬ:

Я проверил данные с помощью psql и получил:

столбец описания:

enter image description here

столбец метаданных:

enter image description here

Кажется, что только столбец meta_data json имеет проблемы с символом* 1060 актеры *

1 Ответ

1 голос
/ 18 октября 2019

Sqlalchemy сериализует поле JSON перед сохранением в дБ (см. url и url и url ).

json_serializer = dialect._json_serializer or json.dumps

По умолчаниюдиалект PostgreSQL использует json.dumps и json.loads.


Когда вы работаете со столбцом Text, данные преобразуются в следующем потоке:

str -> bytes in utf-8 encoding

Когда вы работаетесо столбцом JSON для диалекта PostgreSQL данные преобразуются в следующем потоке:

dict -> str with escaped non-ascii symbols -> bytes in utf-8 encoding

Вы можете переопределить сериализатор в конфигурации вашего двигателя, используя поле json_serializer:

json_serializer=partial(json.dumps, ensure_ascii=False)
...