You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django测试数据库中添加TrigramSimilarity所需扩展?

如何为Django测试数据库添加Trigram扩展?

在项目中使用TrigramSimilarity功能时,测试视图时出现测试数据库未安装对应扩展的报错,测试代码及错误信息如下:

测试代码

def test_person_search(self):
    query = str(self.person.name)

    url = reverse("persons:person_search") + f"?q={query}"

    test_data = {
        "query": query,
        "results": [
            {
                "name": "TestPerson",
                "picture": None,
                "roles": [{"role": "Test", "slug": "test"}],
            }
        ],
    }

    response = self.client.get(url)
    
    self.assertEqual(response.status_code, status.HTTP_200_OK)
    self.assertEqual(response.data, test_data)

错误信息

django.db.utils.ProgrammingError: function similarity(character varying, unknown) does not exist
LINE 1: ...."height_centimeter", "persons_person"."picture", SIMILARITY...
                                                             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

解决方法

方法一:通过Django迁移添加扩展(推荐)

这是最规范的方式,Django会在测试数据库自动创建扩展:

  • 生成空迁移文件:
    python manage.py makemigrations --empty your_app_name
    
  • 编辑生成的迁移文件,添加CreateExtension操作:
    from django.contrib.postgres.operations import CreateExtension
    from django.db import migrations
    
    class Migration(migrations.Migration):
        dependencies = [
            # 填写你的应用依赖的上一个迁移,比如('persons', '0001_initial'),
        ]
    
        operations = [
            CreateExtension('pg_trgm'),
        ]
    
  • 执行迁移:
    python manage.py migrate
    

方法二:在测试类的setUp中手动创建扩展

如果仅需临时测试,可在测试初始化时执行SQL创建扩展:

from django.db import connection
from django.test import TestCase

class PersonSearchTest(TestCase):
    def setUp(self):
        super().setUp()
        with connection.cursor() as cursor:
            cursor.execute('CREATE EXTENSION IF NOT EXISTS pg_trgm;')
    
    # 你的测试方法...

方法三:修改测试数据库配置(不推荐)

在settings.py的数据库配置中,为测试数据库添加连接参数:

DATABASES = {
    'default': {
        # 你的默认数据库配置
        'TEST': {
            'OPTIONS': {
                'options': '-c search_path=public,pg_trgm'
            },
        },
    }
}

该方式依赖数据库连接参数,可靠性不如迁移方案。

内容的提问来源于stack exchange,提问作者MMEEUR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:35:20