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.