Das Problem liegt in cast(Unicode)
eines Postgresql json
Säule. Es wandelt einfach den json
um auf den Texttyp, der Unicode
von SQLAlchemy zugrunde liegt , im Falle von Postgresql VARCHAR
. Mit anderen Worten, es erzeugt eine Zeichenfolgendarstellung von JSON, anstatt den Textinhalt zu extrahieren. Wenn Ihre Eingabe maskierte Unicode-Codepoints enthielt, werden sie wie in diesem Fall ausgegeben. Gegeben sei ein einfacher Test
Modell mit einem json
Spalte Daten :
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."'
Es sollte offensichtlich sein, warum eine Übereinstimmung mit Unicode-Zeichen ohne Escapezeichen fehlschlägt. Der korrekte Weg, den Textinhalt zu extrahieren, ohne Escape-Unicode zu maskieren, ist die Verwendung von astext
, das den ->>
verwendet Betreiber
in Postgresql:
In [13]: session.query(Test.data['summary'].astext).scalar()
Out[13]: 'Tämä on summary.'
Zitieren der JSON-Dokumentation zu Funktionen und Operatoren:
Also in deinem Fall:
Message.query.\
filter(Message.content['summary'].astext.match(term))
Beachten Sie, dass dies nur für json
gilt type, nicht jsonb
, weil der json
Typ konvertiert keine Unicode-Escapezeichen bei der Eingabe. jsonb
andererseits konvertiert alle Unicode-Escapes in äquivalentes ASCII oder UTF-8 Zeichen zum Speichern
. Wenn unser Test
model enthielt eine zweite Spalte data2 jsonb
, mit genau der gleichen Eingabe, dann wäre das Ergebnis:
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"')
Trotzdem sollten Sie astext
verwenden , wenn Sie Text anstelle einer JSON-Zeichenfolgendarstellung wünschen.