pyodbc 未提交对 db2 数据库的更改

pyodbc not committing changes to db2 database

我正尝试在 python 中使用 pyodbc 更新我的 db2 数据库。 sql 语句 运行 直接在数据库上正常没有错误。当我 运行 下面的代码时,我没有收到任何错误并且代码执行成功但是当我查询数据库时,更改没有保存。

try:
    conn2 = pyodbc.connect("DRIVER={iSeries Access ODBC Driver};SYSTEM="+ Config_Main.iseriesServer +";DATABASE="+ Config_Main.iseriesDB +";UID="+ Config_Main.iseriesUser +";PWD=" + Config_Main.iseriesPass)
    db2 = conn2.cursor()

    for row in encludeData:
        count = len(str(row[2]))
        srvid = row[2]
        if count < 10:
            sql3 = "UPDATE SVCEN2DEV.SRVMAST SET svbrch = ? WHERE svtype != '*DCS-' AND svacct = ? AND svcid LIKE '%?' and svbrch = ?"
            db2.execute(sql3, (row[4],row[1],"%" + str(srvid),row[5]))
        else:
            sql3 = "UPDATE SVCEN2DEV.SRVMAST SET svbrch = ? WHERE svtype != '*DCS-' AND svacct = ? AND svcid = ? and svbrch = ?"
            db2.execute(sql3, (row[4],row[1],srvid,row[5]))
        conn2.commit()
except pyodbc.Error as e:
    logging.error(e)

我试过设置conn2.autocommit = True。并且我还尝试在 for 循环内移动 conn2.commit() 以在每次迭代后提交。我还尝试了不同的驱动程序 {IBM i Access ODBC Driver}

编辑:

encludeData

样本
['4567890001','4567890001','1234567890','1234567890','foo','bar']

更改 except 语句以获取一般错误后,上面的代码现在会产生此错误:

IntegrityError('23000', '[23000] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0803 - Duplicate key value specified. (-803) (SQLExecDirectW)')

正如 OP 所发现的那样,应用层语言 Python 可能不会引发特定的数据库异常,例如重复索引或外键问题,因此会静默失败或在服务器端记录。通常影响 SQL 对 运行 的实际查询的错误(例如不正确的标识符和语法错误)会在客户端引发错误。

因此,作为编程的最佳实践,有必要使用异常处理,例如 Python 的 try/except/finally 或与任何外部 API 接口的其他通用语言中的等效项例如数据库连接,以便捕获并正确处理 运行 时间问题。

下面将打印 any 异常 try 块中引发的语句,包括连接和查询执行。并且无论成功或失败都会 运行 finally 语句。

try:
    conn2 = pyodbc.connect(...)
    db2 = conn2.cursor()

    sql = "..."
    db2.execute(sql, params)
    conn2.commit()

except Exception as e:
    print(e)

finally:
    db2.close()
    conn2.close()