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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:51:32