如何将存储过程加载到Django单元测试数据库中最佳方法是什么?

4

我有一些Postgres存储过程,我的Selenium测试将依赖它们。在开发中,我通过脚本中的一行来加载它们:

cat stored_procedures.sql | python manage.py dbshell

这在单元测试时不起作用,因为会从头开始创建一个新的数据库。如何在运行单元测试之前将保存在文件中的存储过程加载到测试数据库中?

2个回答

7
我认为你有几种方法可以实现这个。在我看来,最好的解决方案是添加自定义SQL迁移。将来,在开发和生产阶段,您都需要该迁移。因此,如果您将数据库更改存储在多个位置,部署程序将不清晰。
另一种方法是将您的SQL执行添加到testCase的setUp方法中。
额外的迁移
您应该创建一个新的空迁移./manage.py makemigrations --empty myApp 将您的SQL代码添加到操作列表中 operations = [ migrations.RunSQL('RAW SQL CODE') ]

非常感谢,这看起来完美无缺。 - Michael Terry
这看起来不错,谢谢。但是如果您决定删除所有迁移并重新创建模式,最好将其自动生成。 - nurettin

2
另一种解决方法是创建一个管理命令,执行所需的SQL查询,然后在测试开始之前只需执行此命令即可。 以下是我的情况: 管理命令:
import os
from django.core.management import BaseCommand
from django.db import connection

from applications.cardo.utils import perform_query
from backend.settings import BASE_DIR


class Command(BaseCommand):
    help = 'Loads all database scripts'

    def handle(self, **options):
        db_scripts_path = os.path.join(BASE_DIR, 'scripts', 'database_scripts')
        utils_path = os.path.join(db_scripts_path, 'utils.sql')
        with open(utils_path, mode='r') as f:
            sql_query = f.read()
            with connection.cursor() as cursor:
                cursor.execute(sql_query)

现在你可以直接进入终端并输入以下命令:
python manage.py load_database_scripts

脚本将被加载。

有了像这样的帮助函数

def load():
    with django_db_blocker.unblock():
        call_command('load_database_scripts')

在测试套件运行之前,只需调用此加载函数即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接