Problemet ligger i cast(Unicode)
av en Postgresql json
kolumn. Den castar helt enkelt json
till texttypen som ligger bakom SQLAlchemys Unicode
, i fallet med Postgresql VARCHAR
. Med andra ord producerar den en strängrepresentation av JSON istället för att extrahera textinnehållet. Om din inmatning innehöll escaped unicode-kodpunkter, matas de ut som i det här fallet. Givet ett enkelt Test
modell med en json
kolumn data :
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."'
Det bör vara uppenbart varför en matchning med unescaped unicode-tecken kommer att misslyckas. Det korrekta sättet att extrahera textinnehållet, att undkomma escaped unicode, är att använda astext
, som använder ->>
operatör
i Postgresql:
In [13]: session.query(Test.data['summary'].astext).scalar()
Out[13]: 'Tämä on summary.'
Citerar dokumentationen för JSON-funktioner och operatörer:
Så i ditt fall:
Message.query.\
filter(Message.content['summary'].astext.match(term))
Observera att detta endast gäller json
typ, inte jsonb
, eftersom json
typ konverterar inte unicode-escapes vid ingång. jsonb
å andra sidan konverterar alla unicode-escapes till motsvarande ASCII eller UTF-8 tecken för lagring
. Om vårt Test
modellen innehöll en andra kolumn data2 jsonb
, med exakt samma inmatning, då skulle resultatet bli:
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"')
Ändå bör du använda astext
, om du vill ha text istället för en strängrepresentation av JSON.