在django中查询objects.extra

时间:2013-04-08 06:25:20

标签: sql django postgresql

如何使用to_tsquery查询部分单词匹配

例如  记录

'hello old world'
'hello world'
'hi welcome'
'hi'

在这里,我想返回包含“hello”或“welcome”字样的所有记录

SELECT * FROM accounts_order
WHERE name_tsvector @@ to_tsquery('english','hello | welcome');

这会正确返回。 在这里,我尝试使用django'objects.extra'查询

来实现
queryset = Order.objects.extra(where=['name_tsvector @@ to_tsquery(%s|%s)'], params=['hello','welcome'])

此查询无效,出现异常

operator is not unique: unknown | unknown
LINE 1: ...nts_order" WHERE name_tsvector @@ to_tsquery(E'olmin'|E'20')
                                                            ^
HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.

我如何将此params部分作为列表传递?

1 个答案:

答案 0 :(得分:1)

您希望字符串中包含|,即OR中的布尔tsquery

regress=> select to_tsquery('english', 'olmin|20');
   to_tsquery   
----------------
 'olmin' | '20'
(1 row)

Django正在将%s扩展为E'string',因此您无法撰写%s|%s;正如您所见,它扩展为E'string1'|E'string2',在两个字符串上被解释为布尔OR。你必须:

  • 将Django中的两个字符串和|与(例如)params=['hello'+'|'+'welcome']和一个(%s)参数连接起来;或
  • 获取Pg以使用文字|连接两个字符串,例如(%s||'|'||%s)

我推荐第一个选项;它要求您更改从Python传递的参数,但它会产生更简单的SQL。

原始文件无效,它试图在两个字符串文字上执行布尔OR

regress=> select to_tsquery('english', 'olmin'|'20');
ERROR:  operator is not unique: unknown | unknown
LINE 1: select to_tsquery('english', 'olmin'|'20');
                                            ^
HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.