Django 单元测试中的原始 sql 查询

raw sql queries in django unittests

我在代码中编写了一些自定义 SQL select 查询 - 我们使用的是 postgresql。原来我的单元测试失败了,因为测试数据库不包含实际数据。为了说明这个事实,我写了这个小测试用例:

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

from highlights.models import Feature


class TestRaw(TestCase):
    def setUp(self):
        Feature(username="me", feature=True).save()

    def test_raw(self):
        # this check passes
        self.assertEqual(1, Feature.objects.all().count())

        # raw queries do not, 1 != 0
        with connection.cursor() as c:
            c.execute("SELECT count(*) FROM highlights_flag")
            r = c.fetchone()
            self.assertEqual(1, r[0])

原始 sql 查询看不到存储在 TestCase class 的 setUp 方法中的 Feature 对象。我还用 psql 确认测试数据库是空的。

我假设 django 的测试框架为每个测试用例创建一个新的数据库事务并在它完成时回滚它——不过只是猜测。

您知道如何让我的自定义 sql 代码可测试吗?换句话说:我可以做些什么让这个测试用例工作吗?

谢谢

您正在从 highlights_flag table 中选择,但模型名为 Feature。也许您应该将查询更改为:

SELECT count(*) FROM highlights_feature