在我的 Django 设置中,我有一个名为
POSTGRES_STATEMENT_TIMEOUT
的设置,它允许我配置 statement timeout。我将默认设置为 30 秒。注意,我是 django-environ.
# settings.py
env = environ.Env(
POSTGRES_STATEMENT_TIMEOUT=(str, "30s"),
)
POSTGRES_STATEMENT_TIMEOUT = env("POSTGRES_STATEMENT_TIMEOUT")
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
...
"OPTIONS": {
"options": f"-c statement_timeout={POSTGRES_STATEMENT_TIMEOUT}s"
},
}
}
我想写一个简单的测试来确保 postgres 语句超时设置正常工作。注意我正在使用 pytest-django。
# tests.py
def test_statement_timeout(settings):
# Lower statement timeout so this test doesn't take 30s to run.
settings.POSTGRES_STATEMENT_TIMEOUT = "1s"
with connection.cursor() as cursor:
with pytest.raises(OperationalError) as exc:
cursor.execute("select pg_sleep(2)")
assert "canceling statement due to statement timeout" in str(exc.value)
这是测试失败。当我打印
settings.DATABASES
时,我看到语句超时仍然是 30 秒,而不是 1 秒。
即使我直接通过
settings.DATABASES
覆盖settings.DATABASES["default"]["OPTIONS"] = {"options": "-c statement_timeout=1s"}
,测试仍然失败。
我想我需要在更新设置后重新启动数据库连接。反正有没有在测试中这样做?