【问题标题】:pypyodbc not throwing expected exception upon retry of connectionpypyodbc 在重试连接时没有抛出预期的异常
【发布时间】:2013-11-16 04:28:59
【问题描述】:

我正在尝试使用 pypyodbc 将一些数据行插入到 SQL Server 数据库中。我编写的代码会捕获任何 pypyodbc.Error,如果发生这种情况,最多重试数据库操作 3 次。在我的测试中,我设法插入重复的关键数据行 - 异常被捕获并开始重试。问题是重试时没有捕获到异常并且代码挂起。代码如下:

# 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.. ..) 报告。重试开始,值再次写入控制台。这是程序挂起的地方。为什么在重试时没有捕获到异常?

【问题讨论】:

    标签: python sql sql-server exception


    【解决方案1】:

    您的代码每次失败时都会重复整个插入过程,失败后第一次尝试将再次失败,因为记录已经插入。

    我建议使用计数器而不是 for 循环来限制您的试验:

    trials = 0
    db = pypyodbc.connect("DRIVER={SQL Server};SERVER=SERVER;DATABASE=DB;UID=user;PWD=password")
    cursor = db.cursor()
    
    for j in range (0,sector):
        assert trials < 3
        value1 = list1[j]
        value2 = list2[j]
        value3 = list3[j]
        print('Value 1 = {0}\nValue 2 = {1}\nValue 3 = {2}'.format(value1,value2,value3))
        try:
            cursor.execute('''INSERT INTO table(field1,field2,field3) VALUES (?,?,?)'''
                           , (value1,value2,value3))
            cursor.commit()
        except pypyodbc.Error, e:
            trials += 1
            message = "Connection attempt " + str(trials) + ": " + str(e)
            print(message)
        except AssertionError:
            message = message + "\nThe script will now terminate."
            print (message)
            send_error_email(message)
            sys.exit()
    
    cursor.close()
    db.close()
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-04-05
      • 2017-02-16
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多