【问题标题】:How to use pg_trgm operators(e.g. %>) in django framework?如何在 django 框架中使用 pg_trgm 操作符(例如 %>)?
【发布时间】:2019-01-23 02:53:35
【问题描述】:

我在 PostgreSQL DB 上使用pg_trgm 进行相似性搜索,我需要使用 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

【问题讨论】:

    标签: python django string-formatting string-substitution pg-trgm


    【解决方案1】:

    看起来您的问题实际上与 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,而不必求助于原始查询字符串。只需确保您有一个首先激活扩展的迁移:

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

    要使用它们,您需要在 PostgreSQL 上激活 pg_trgm extension。 您可以使用TrigramExtension migration operation 安装它。

    【讨论】:

    • 感谢您提供这么多好的建议,我通过使用 [%%>] 解决了问题。
    • 我用了trigramSimilarity。太棒了!谢谢!
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢。但是 [=] 不符合我上面显示的相似性搜索。
    • 搞混了。现在尝试使用转义的%% 符号的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多