O problema está em
cast(Unicode) de um json Postgresql coluna. Ele simplesmente faz o CAST do json para o tipo de texto subjacente ao Unicode do SQLAlchemy , no caso do Postgresql VARCHAR . Em outras palavras, ele produz uma representação de string de JSON em vez de extrair o conteúdo do texto. Se sua entrada contiver pontos de código unicode com escape, eles serão emitidos como estão neste caso. Dado um simples Test modelo com um json coluna dados :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."'
Deve ser evidente por que uma correspondência com caracteres unicode sem escape falhará. A maneira correta de extrair o conteúdo do texto, sem escapar do unicode com escape, é usar
astext
, que usa o ->> operador
no Postgresql:In [13]: session.query(Test.data['summary'].astext).scalar()
Out[13]: 'Tämä on summary.'
Citando a documentação de funções e operadores JSON:
Então no seu caso:
Message.query.\
filter(Message.content['summary'].astext.match(term))
Observe que isso se aplica apenas a
json tipo, não jsonb , porque o json type não converte escapes unicode na entrada. jsonb por outro lado, converte todos os escapes unicode em ASCII ou UTF-8 equivalentes caracteres para armazenamento
. Se nosso Test modelo continha uma segunda coluna data2 jsonb , com exatamente a mesma entrada, o resultado seria: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"')
Ainda assim, você deve usar
astext , se você quiser texto em vez de uma representação de string de JSON.