使用UTF-8的JSON字段中的SQLAlchemy文本匹配数据

使用UTF-8的JSON字段中的SQLAlchemy文本匹配数据,第1张

使用UTF-8的JSON字段中的SQLAlchemy文本匹配数据

问题出在

cast(Unipre)
Postgresql
json
列中。在Postgresql的情况下,它将CAST简单地转换为
json
SQLAlchemy的文本类型。换句话说,它生成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))

请注意,这仅适用于

json
type,而不适用于
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的字符串表示形式,则应该使用。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5664256.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存