Python – SQL Server on Ubuntu のエラーハンドリング & リトライ方法  No.93

自己投資としてチャレンジしている内容を Blog で公開しています。今回は python を使った SQL Server 接続時の「エラーハンドリング」と「リトライ」方法について紹介します。

▼1. 接続時のエラーハンドリング & リトライ の必要性について

クラウドサービスに接続する際、ネットワークの瞬断の影響を受けることはよくあるため、接続時にエラーハンドリングをし、インターバルの間隔を入れてリトライすることは必須です。

今回は Ubuntu にインストールされた SQL Server を使って、SQL Server 接続時、どのようにエラーハンドリングし、インターバルの間隔を入れてリトライするのか説明します。


▼2. 事前準備

以前本 blog で紹介したコードに、エラーハンドリング及び、リトライ設定を追加します。

Python – SQL Server on Ubuntu に接続する方法  No.92


▼3. 接続時のエラーハンドリング & リトライ の実装

3-1. エラーハンドリング & リトライを行う python コードを作成

While を使って、エラーになった場合 15 秒のインターバルで 3 回のリトライを実施しています。エラーを発生させるため、SQL Server のホスト名を localhost ではなく、localhost1 に変更して接続しています。

# runquery_retry.py

import pyodbc
import time
import datetime

server = 'localhost1'
database = 'testdb'
username = 'sa'
password = 'yourpassword
driver= '{ODBC Driver 17 for SQL Server}'
success = False
retryc = 0
max_retries = 3

while not success and retryc < max_retries:
    try:
        cnxn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+',1433;DATABASE='+database+';UID='+username+';PWD='+ password)
        cursor = cnxn.cursor()
        cursor.execute("SELECT * FROM testdb.dbo.sampletable")
        row = cursor.fetchone()
        
        while row:
            print (str(row[0]) + " " + str(row[1]))
            row = cursor.fetchone()
            
        success = True
    except pyodbc.Error as ex:
        retryc += 1
        print("Current Timestamps:" + str(datetime.datetime.now()) + "retry count: " + str(retryc))
        print("==========================")
        print("Error: " + str(ex))
        print("==========================")
        time.sleep(15)

3-2. 実行結果

既定の 30 秒のタイムアウトに加え、15 秒のリトライインターバルを入れているため、リトライは 45 秒後となっています。

Current Timestamps:2022-12-05 10:42:06.523664retry count: 1
==========================
Error: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')
==========================
Current Timestamps:2022-12-05 10:42:51.536645retry count: 2
==========================
Error: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')
==========================
Current Timestamps:2022-12-05 10:43:36.552769retry count: 3
==========================
Error: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')
==========================

▼4. 参考情報

  1. Python in Visual Studio Code
  2. Python – SQL Server on Ubuntu に接続する方法  No.92
  3. Java – SQL Server on Linux に接続時の「エラーハンドリング」 &「リトライ」方法 No.6

以上です。参考になりましたら幸いです。



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です