pyodbc没有提交对db2数据库的更改

时间:2017-11-15 14:40:21

标签: python python-3.x db2 pyodbc

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

"[{\"firstname\":\"John\",\"lastname\":\"Doe\",\"rating\":9.3,\"children\":[\"John A\",\"John B\",\"John C\"],\"id\":1},{\"firstname\":\"Marry\",\"lastname\":\"Jane\",\"rating\":8.5,\"children\":[\"JaneA\",\"JaneB\"],\"id\":2}]"

我尝试过设置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) 。我也尝试在每次迭代后移动for循环中的conn2.autocommit = True进行提交。我还尝试了不同的驱动程序conn2.commit()

修改

{IBM i Access ODBC Driver}

的示例
encludeData

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

  

IntegrityError(&#39; 23000&#39;,&#39; [23000] [IBM] [System i Access ODBC Driver] [DB2 for i5 / OS] SQL0803 - 指定了重复的键值。( - 803)( SQLExecDirectW)&#39)

1 个答案:

答案 0 :(得分:2)

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

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

下面将在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()