栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用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的字符串表示形式,则应该使用。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/662300.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号