sql >> Databasteknik >  >> RDS >> PostgreSQL

SQLAlchemy Text Matching data inuti JSON-fält med UTF-8

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.




  1. Infoga standard i kolumnen inte null om värdet är null

  2. Viloläge Skapa kriterier för att gå med i samma tabell två gånger - försökte 2 tillvägagångssätt med 2 skillnadsfel

  3. Lägg till kolumner i en befintlig tabell i SQL Server Database

  4. SESSIONTIMEZONE Funktion i Oracle