![](/img/trans.png)
[英]sqlalchemy and asyncpg – set postgres statement_timeout
[英]Django - PostgreSQL set statement_timeout
我正在使用 Django 1.10 和 PostgreSQL 数据库。 我想弄清楚我是否可以从 Django 设置statement_timeout
。似乎我不能像connect_timeout
一样(在settings.py
):
DATABASES[DEFAULT]['OPTIONS'] = {
'connect_timeout': float(os.getenv('DEFAULT_DB_OPTIONS_TIMEOUT', 5))
}
我看到了这样的东西,但我找不到验证它是否确实有效的方法:
DATABASES[DEFAULT]['OPTIONS'] = {
'options': '-d statement_timeout=700'
}
我知道我可以直接从数据库中设置它,例如:
set statement_timeout=5000
但我正在寻找一种从 Django 开始的方法。
没有其他“Django”方法可以做到这一点。 Django 方法是像您指示的那样使用您的settings.py
,除了您的示例不太正确。 它应该是:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
...
'OPTIONS': {
'options': '-c statement_timeout=5000',
...
}
}
}
'OPTIONS' 字典用于 arguments 到数据库连接字符串。 可以在此处找到 Postgres arguments 的列表。 options
连接字符串参数允许您为 postgres 指定命令行 arguments。 -c
选项在这里解释。
注意超时是以毫秒为单位的,所以上面的5000
表示 5 秒。
我在Windows 11上使用Django 3.2.16然后,我在OPTIONS
中设置'-c statement_timeout=5000'
和'SET statement_timeout = 5000;'
在settings.py
中使用cursor.execute()
如下所示:
# "settings.py"
from django.db import connection
# ...
DATABASES = {
'default':{
'ENGINE':'django.db.backends.postgresql',
'NAME':'postgres',
'USER':'postgres',
'PASSWORD':'admin',
'HOST':'localhost',
'PORT':'5432',
# 'ATOMIC_REQUESTS': True,
},
'OPTIONS': {
'options': '-c statement_timeout=5000' # Here
}
}
cursor = connection.cursor()
cursor.execute('SET statement_timeout = 5000;') # Here
然后,下面的cursor.execute('SELECT pg_sleep(10);')
test
视图运行没有任何错误,因为settings.py
中的statement_timeout = 5000
在test
视图中不起作用:
# "views.py"
from django.db import connection
from django.http import HttpResponse
def test(request):
cursor = connection.cursor()
cursor.execute('SELECT pg_sleep(10);')
return HttpResponse("Test")
但是,当在test
视图中设置statement_timeout = 5000
时,如下所示:
# "views.py"
from django.db import connection
from django.http import HttpResponse
def test(request):
cursor = connection.cursor()
cursor.execute('SET statement_timeout = 5000;')
cursor.execute('SELECT pg_sleep(10);')
return HttpResponse("Test")
出现以下错误是因为test
视图中的statement_timeout = 5000
工作正常。 * cursor.execute('SET statement_timeout = 5000;')
只适用于test
视图而不适用于其他视图,因此如果要应用cursor.execute('SET statement_timeout = 5000;')
,则需要在每个视图中调用cursor.execute('SET statement_timeout = 5000;')
cursor.execute('SET statement_timeout = 5000;')
每个视图:
django.db.utils.OperationalError: 由于语句超时取消语句
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.