1

pypyodbc を使用して、SQL Server データベースにいくつかの行のデータを挿入しようとしています。私が書いたコードは、pypyodbc.Error をキャッチし、これが発生した場合、最大 3 回まで DB 操作を再試行します。私のテストでは、データの重複キー行を挿入しようとすることに成功しました - 例外がキャッチされ、再試行が開始されます。問題は、再試行時に例外がキャッチされず、コードがハングすることです。コードは次のとおりです。

# attempt to connect to the db - if unsuccessful, try up to 3 times
for i in range (3):
    try:
        # connect to db
        db = pypyodbc.connect("DRIVER={SQL Server};SERVER=SERVER;DATABASE=DB;UID=user;PWD=password")
        cursor = db.cursor()

        # Loop round assigning the values in the lists at the given index to a new variable
        for j in range (0,sector):
            value1 = list1[j]
            value2 = list2[j]
            value3 = list3[j]

            # print each of the values, as a sanity check
            print('Value 1 = ' + value1)
            print('Value 2 = ' + value2)
            print('Value 3 = ' + value3+ "\n")

            #if (value1 is not None and value2 is not None and value3 is not None):
            cursor.execute('''INSERT INTO table(field1,field2,field3) VALUES (?,?,?)''', (value1,value2,value3))
            cursor.commit()

        # close off the open connections
        cursor.close()
        db.close()
        # if successful, break out of the loop so there is no retry
        break

    # if there is a mysql exception thrown, print a message and retry
    except pypyodbc.Error, e:
        message = "Connection attempt " + str(i+1) + ": " + str(e)
        print(message)

    # if we reach this stage for a 3rd time, exit the program as no connection is possible and send an error email
    if i == 2:
        message = message + "\nThe script will now terminate."
        print (message)
        send_error_email(message)
        sys.exit()

最初の試行で値がコンソールに書き込まれ、例外 (u'23000', u"[23000] [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot insert duplicate key row in object....)が報告されます. 再試行が開始され、値がコンソールに再度書き込まれます. ここでプログラムがハングします. 再試行で例外がキャッチされないのはなぜですか?

4

1 に答える 1