
问题出在
cast(Unipre)Postgresql
json列中。在Postgresql的情况下,它将CAST简单地转换为
jsonSQLAlchemy的文本类型。换句话说,它生成JSON的字符串表示形式,而不是提取文本内容。如果您的输入包含转义的unipre代码点,则在这种情况下将按原样输出它们。给定一个带有列
数据 的简单模型:
Unipre``VARCHAR``Test``json__
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(Unipre)).scalar()Out[11]: '"T\u00e4m\u00e4 on summary."'很明显,与未转义的unipre字符的匹配为什么会失败。提取文本内容(转义转义的unipre)的正确方法是使用
astext,它使用了Postgresql中的
->>运算符:
In [13]: session.query(Test.data['summary'].astext).scalar()Out[13]: 'Tämä on summary.'
引用JSON函数和运算符文档:
注意:
其中许多函数和运算符会将JSON字符串中的Unipre转义转换为适当的单个字符。如果输入为jsonb类型,则这不是问题,因为转换已经完成;但是对于json输入,这可能会导致引发错误,如第8.14节所述。
因此,在您的情况下:
Message.query. filter(Message.content['summary'].astext.match(term))
请注意,这仅适用于
jsontype,而不适用于
jsonb,因为该
json类型不会转换输入时的Unipre转义。
jsonb另一方面,将所有Unipre转义转换为等效的ASCII或UTF-8字符进行存储。如果我们的
Test模型包含第二列
data2 jsonb,其输入完全相同,那么结果将是:
In [11]: session.query(Test.data['summary'].cast(Unipre), ...: Test.data2['summary'].cast(Unipre)).first()Out[11]: ('"T\u00e4m\u00e4 on summary."', '"Tämä on summary"')不过,
astext如果您想要文本而不是JSON的字符串表示形式,则应该使用。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)