![](/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.