【问题标题】:HINT: No function matches the given name and argument types. You might need to add explicit type casts. TrigramSimilarity Django提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。 TrigramSimilarity Django
【发布时间】:2019-03-23 20:04:16
【问题描述】:

我正在尝试使用TrigramSimilarity 进行全文搜索。我已经在 PostgreSQL 中激活了pg_trgm 扩展。并在我安装的应用程序中添加了django.contrib.postgres。但是当我尝试查询时

blog.objects.annotate(similarity=TrigramSimilarity('name', 'abc'),).filter(similarity__gt=0.3).order_by('-similarity')

但它给了我一个错误

psycopg2.ProgrammingError:函数相似性(字符不同,未知)不存在 第 1 行:...others_2"、"blog_mod"、相似度... ^ 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

为什么会发生此错误。请帮帮我。

【问题讨论】:

  • blog 模型类是否有 name 字段?
  • 是的,它有名称字段
  • 然后好像数据库中没有安装pg_trgm扩展。你做了什么来启用它?你检查它是否安装成功了?
  • 我使用“sudo -u postgres psql”进入我的数据库并使用了这个命令“CREATE EXTENSION pg_trgm;”
  • 错误信息与pg_trgm未创建一致。 stackoverflow.com/questions/2254999/…

标签: python django python-3.x postgresql


【解决方案1】:

该错误表明该扩展尚未安装。我不知道为什么会这样。可能您没有在用于 django 的数据库中安装扩展?

可以从您的 django 代码执行原始 sql 查询。这将确保您以正确的数据库/架构为目标。

from django.db import connection
with connection.cursor() as cursor:
    cursor.execute('CREATE EXTENSION IF NOT EXISTS pg_trgm')

您还可以使用 Django 的自定义 TrigramExtension 迁移。创建扩展查询是一样的。但是,如果您在同样需要启用 pg_trgm 的测试数据库上运行集成测试,那么迁移是一个好主意。

https://docs.djangoproject.com/en/2.1/ref/contrib/postgres/operations/#database-migration-operations

【讨论】:

  • 是的,它有效。我在 django 使用的数据库中安装了 pg_trgm 。非常感谢你
【解决方案2】:

我也有同样的问题。如果您在安装此扩展程序之前未在搜索路径中包含将使用 TrigramSimilarity() 的架构,则会发生这种情况。

试试

SET search_path TO my_schema

然后

CREATE EXTENSION IF NOT EXISTS pg_trgm;

【讨论】:

    【解决方案3】:

    我猜你可能没有连接到正确的数据库。

    在 Ubuntu 中。试试……

    $ sudo su postgres
    
    $ psql <db_name>
       <db_name> = Name of DB being used by the Django project.
       e.g psql badass_db
    
    $ CREATE EXTENSION pg_trgm;
    

    【讨论】:

      【解决方案4】:

      如果 pg_trgm 扩展是在公共架构中创建的,您可能会在另一个架构中得到错误。这对我有用:

      select public.similarity('foo','bar');
      

      而如果我尝试 Szymon 的解决方案 Postgres 告诉我扩展已经存在。我还没有找到这方面的文档。

      【讨论】:

        【解决方案5】:

        这是因为(我不知道为什么?)TrigramSimilarity 不适用于 search_query。相反,它将与字符串一起使用。或者不使用 SearchVectorField 而是使用常规字段。

        【讨论】:

          猜你喜欢
          • 2020-08-26
          • 2021-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-13
          • 2016-01-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多