sql >> Database >  >> RDS >> PostgreSQL

SQLAlchemy Text Matching-gegevens in JSON-veld met UTF-8

Het probleem ligt in cast(Unicode) van een Postgresql json kolom. Het CAST gewoon de json naar het teksttype dat ten grondslag ligt aan SQLAlchemy's Unicode , in het geval van Postgresql VARCHAR . Met andere woorden, het produceert een tekenreeksrepresentatie van JSON in plaats van de tekstinhoud te extraheren. Als uw invoer ontsnapte unicode-codepunten bevat, worden ze uitgevoerd zoals in dit geval. Gegeven een eenvoudige Test model met een json kolom gegevens :

In [7]: t = Test(data={'summary': 'Tämä on summary.'})

In [8]: session.add(t)

In [9]: session.commit()

In [11]: session.query(Test.data['summary'].cast(Unicode)).scalar()
Out[11]: '"T\\u00e4m\\u00e4 on summary."'

Het moet duidelijk zijn waarom een ​​match met unescaped Unicode-tekens zal mislukken. De juiste manier om de tekstinhoud te extraheren, zonder escaped unicode, is om astext , die de ->> gebruikt operator in Postgresql:

In [13]: session.query(Test.data['summary'].astext).scalar()
Out[13]: 'Tämä on summary.'

Citaat van de JSON-functies en operatordocumentatie:

Dus in jouw geval:

Message.query.\
    filter(Message.content['summary'].astext.match(term))

Merk op dat dit alleen van toepassing is op json type, niet jsonb , omdat de json type converteert geen unicode-escapes bij invoer. jsonb aan de andere kant converteert alle unicode-escapes naar equivalente ASCII of UTF-8 tekens voor opslag . Als onze Test model bevatte een tweede kolom data2 jsonb , met exact dezelfde invoer, dan zou het resultaat zijn:

In [11]: session.query(Test.data['summary'].cast(Unicode),
    ...:               Test.data2['summary'].cast(Unicode)).first()
Out[11]: ('"T\\u00e4m\\u00e4 on summary."', '"Tämä on summary"')

Toch moet u astext . gebruiken , als u tekst wilt in plaats van een tekenreeksrepresentatie van JSON.




  1. Kan geen verbinding maken met Oracle vanuit een Windows-service (fout:ORA-12154:TNS:kan servicenaam niet omzetten (12154) )

  2. Installeren en werken met MySQL 5 op Windows 7

  3. Een rij in dezelfde tabel kopiëren zonder de 50+ kolomnamen te hoeven typen (terwijl u 2 kolommen wijzigt)

  4. 3 manieren om een ​​getal op te maken als een percentage in PostgreSQL