测试后Django 3.1未关闭postgres db连接

时间:2020-09-12 04:31:46

标签: django database testing

以下方法被称为测试的一部分(测试试图在数据库中查找外部api调用,如果找不到它,它将进行真正的API调用)

    def _ask_transliterate(self, content):
        found = APITransliteration.objects.filter(
            source_text=content, from_lang=self.from_lang, to_lang=self.to_lang
        )
        if len(found) == 0:
            my_json = self._ask_actual_api(content, TRANSLIT_PATH, self.translit_params())
            my = APITransliteration(
                source_text=content, response_json=my_json, from_lang=self.from_lang, to_lang=self.to_lang
            )                                                                                                                                                           
            my.save()
            return my.response_json
        return found.first().response_json

当我只调用从TestCase继承的类时,它运行良好,我认为这是因为它在数据库中找不到值,因此遵循内部if。如果我进行了全部测试,则django由于连接断开而拒绝破坏测试数据库,并且

SELECT * FROM pg_stat_activity;

报告是与first()调用相对应的查询。这是有道理的,因为两个测试使用相同的参数调用了该方法,因此可以找到第二次运行的值(这是最后执行的测试)。对我而言,没有太大意义的是为什么在成功完成完整的测试运行后,连接处于ClientReadIdle中。

是我在这里做错什么吗?我该怎么称呼它,以免在django不知道需要清理的地方留下空闲连接?在测试的情况下,更糟的是它有时似乎会被清除,因为有时它会拒绝删除,而有时会删除就可以了。

编辑:我发现我可以通过创建TestRunner并在运行程序运行teardown_databases方法之前手动关闭连接来确保清理连接:

class CleanupTestRunner(DiscoverRunner):
    def teardown_databases(self, old_config, **kwargs):
        connections["userdata"].close()
        connection.close()

        super(CleanupTestRunner, self).teardown_databases(old_config, **kwargs)

尽管我在主代码中是否做错了一些事情,但我仍然感到困惑,因为这有点像个hack。

0 个答案:

没有答案
相关问题