如何在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
相关产品推荐
相关产品推荐

