如何在pytest-django测试库创建后建表前用django_db_setup执行指定SQL?
在测试数据库建表前加载PostgreSQL扩展的实现方案
因为你在pytest.ini里配置了--no-migrations,没法通过迁移添加PostgreSQL扩展,重写django_db_setup fixture是可行的解决办法,直接上实现代码:
方案一:完全自定义数据库初始化流程
import pytest from django.db import connection from django.core.management import call_command @pytest.fixture(scope='session') def django_db_setup(): # 创建测试数据库 db_name = connection.settings_dict['NAME'] connection.creation.create_test_db(verbosity=0, autoclobber=True) # 建表前执行扩展创建语句 with connection.cursor() as cursor: cursor.execute('CREATE EXTENSION IF NOT EXISTS pg_trgm;') cursor.execute('CREATE EXTENSION IF NOT EXISTS btree_gin;') # 同步表结构(适配--no-migrations) # Django 1.9及以上版本用这句 call_command('migrate', '--run-syncdb', verbosity=0, interactive=False) # Django 1.9以下版本替换为:call_command('syncdb', verbosity=0, interactive=False) # 测试结束后销毁数据库 yield connection.creation.destroy_test_db(db_name, verbosity=0)
方案二:复用原有fixture逻辑
如果不想完全重写初始化流程,也可以基于原有的django_db_setup fixture做扩展:
import pytest from django.db import connection from pytest_django.fixtures import django_db_setup as original_django_db_setup @pytest.fixture(scope='session') def django_db_setup(original_django_db_setup): # 在表创建前执行扩展创建语句 with connection.cursor() as cursor: cursor.execute('CREATE EXTENSION IF NOT EXISTS pg_trgm;') cursor.execute('CREATE EXTENSION IF NOT EXISTS btree_gin;') # 执行原fixture的表创建逻辑 yield original_django_db_setup
关键说明
- 用
CREATE EXTENSION IF NOT EXISTS可以避免重复创建扩展时的报错 - fixture作用域设为
session,确保整个测试会话只执行一次,提升运行效率 - 两种方案都能保证扩展在所有表创建之前被成功加载
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

