psycopg2でトランザクション\クエリのタイムアウトを設定しますか? 質問する

psycopg2でトランザクション\クエリのタイムアウトを設定しますか? 質問する

タイムアウトを設定する方法はありますか?サイコップ2DBトランザクション用ですか、それともDBクエリ用ですか?

使用例:
Heroku は django の Web リクエストを 30 秒に制限し、その後 Heroku はリクエストを終了し、まだ返されていないトランザクションを django が適切にロールバックすることを許可しません。これにより、未処理のトランザクションが postgres 上に開いたままになる可能性があります。データベースでタイムアウトを設定することもできますが、メンテナンス スクリプトや分析などの Web に関連しないクエリも制限されます。この場合、ミドルウェア (またはdjango経由)が望ましいでしょう。

ベストアンサー1

オプションパラメータを使用して接続時のタイムアウトを設定できます。構文は少し奇妙です:

>>> import psycopg2
>>> cnn = psycopg2.connect("dbname=test options='-c statement_timeout=1000'")
>>> cur = cnn.cursor()
>>> cur.execute("select pg_sleep(2000)")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
psycopg2.extensions.QueryCanceledError: canceling statement due to statement timeout

env 変数を使用して設定することもできます。

>>> import os
>>> os.environ['PGOPTIONS'] = '-c statement_timeout=1000'
>>> import psycopg2
>>> cnn = psycopg2.connect("dbname=test")
>>> cur = cnn.cursor()
>>> cur.execute("select pg_sleep(2000)")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
psycopg2.extensions.QueryCanceledError: canceling statement due to statement timeout

おすすめ記事