如何在 Django 框架中使用 pg_trgm 运算符(例如 %>)?
How to use pg_trgm operators(e.g. %>) in django framework?
我在 PostgreSQL 数据库上使用 pg_trgm
进行相似性搜索,我需要使用 Django 模型 return 将结果放在前面。但是,我遇到了 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
尝试用转义后的 %%
符号替换 %>
项。这应该导致以下简单的 SQL 查询:
'select * from mytable where columnname = %%%s%%'
我相信这个查询应该足以满足您的目的。
看来您的问题实际上与 Python 的字符串替换有关。为了构建最终的查询字符串,Django 会做类似的事情:
self.sql % self.params
这使用旧式 %-格式,它想将您的 %>
解释为字符串替换机制,类似于 %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
的基本用法上有 documentation,而无需求助于原始查询字符串。只需确保您有一个首先激活扩展的迁移:
In addition to the trigram_similar
lookup, you can use a couple of other expressions.
To use them, you need to activate the pg_trgm
extension on PostgreSQL.
You can install it using the TrigramExtension
migration operation.
我在 PostgreSQL 数据库上使用 pg_trgm
进行相似性搜索,我需要使用 Django 模型 return 将结果放在前面。但是,我遇到了 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
尝试用转义后的 %%
符号替换 %>
项。这应该导致以下简单的 SQL 查询:
'select * from mytable where columnname = %%%s%%'
我相信这个查询应该足以满足您的目的。
看来您的问题实际上与 Python 的字符串替换有关。为了构建最终的查询字符串,Django 会做类似的事情:
self.sql % self.params
这使用旧式 %-格式,它想将您的 %>
解释为字符串替换机制,类似于 %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
的基本用法上有 documentation,而无需求助于原始查询字符串。只需确保您有一个首先激活扩展的迁移:
In addition to the
trigram_similar
lookup, you can use a couple of other expressions.To use them, you need to activate the
pg_trgm
extension on PostgreSQL. You can install it using theTrigramExtension
migration operation.