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()
我正尝试在 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()