簡體   English   中英

Django - PostgreSQL 設置語句超時

[英]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 = 5000test視圖中不起作用:

# "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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM