2

pg_trgm在 PostgreSQL DB 上使用相似度搜索,我需要使用 Django 模型将结果返回到前面。但是,我遇到了一个问题,即%>Django 框架无法识别操作员。

有什么建议吗?

谢谢你。

我使用model.objects.raw()来执行 SQL。我得到一个错误响应:

unsupported format character '>' (0x3e) at index 52
searchParam ='test'
mymodel.objects.raw('select * from mytable where columnname %> %s', [searchParam])
ValueError: response:unsupported format character '>' (0x3e) at index 52
4

2 回答 2

0

尝试用%>转义%%符号替换该术语。这应该会产生以下简单的 SQL 查询:

'select * from mytable where columnname = %%%s%%'

我相信这个查询应该足以满足您的目的。

于 2019-01-23T03:16:12.980 回答
0

看起来您的问题实际上与 Python 的字符串替换有关。为了构造最终的查询字符串,Django 执行以下操作:

self.sql % self.params

这使用旧样式 %-formatting,它希望将 your 解释%>为字符串替换机制,类似于%s,但这不是有效的组合。要在格式化字符串中创建一个%字符,您只需%%在输入字符串中使用,如下所示:

In [1]: MyModel.objects.raw('SELECT * FROM myapp_mymodel WHERE myfield %%> %s', ['test'])
Out[1]: <RawQuerySet: SELECT * FROM myapp_mymodel WHERE myfield %> test>

...

顺便说一句,Django 有关于基本用法的文档pg_trgm,而不必求助于原始查询字符串。只需确保您有一个首先激活扩展的迁移:

除了trigram_similar查找之外,您还可以使用其他几个表达式。

要使用它们,您需要在 PostgreSQL 上激活pg_trgm 扩展。您可以使用TrigramExtension 迁移操作安装它。

于 2019-01-23T03:54:23.157 回答