ibm_db python python-3.x db2 pyodbc

ibm_db - pyodbc python



pyodbc no confirma cambios en la base de datos db2 (1)

Como descubrió OP, el lenguaje de capa de aplicación, Python, no puede generar excepciones de bases de datos específicas como problemas de índices duplicados o de claves externas y, por lo tanto, fallará silenciosamente o se registrará en el servidor. Por lo general, los errores que afectan a las consultas SQL reales para que se ejecuten como identificadores incorrectos y errores de sintaxis generarán un error en el lado del cliente.

Por lo tanto, como mejor práctica en programación, es necesario usar manejo de excepciones como try/except/finally Python o su equivalente en otros lenguajes de uso general que interactúen con cualquier API externa como conexiones de base de datos para atrapar y manejar adecuadamente los problemas de tiempo de ejecución.

A continuación, se imprimirá cualquier excepción en las declaraciones planteadas en el bloque try , incluida la conexión y la ejecución de consultas. E independientemente de si tiene éxito o no, ejecutará las declaraciones finales.

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()

Estoy tratando de actualizar mi base de datos db2 usando pyodbc en python. La instrucción sql se ejecuta normalmente sin errores en la base de datos directamente. cuando ejecuto el código a continuación, no aparece ningún error y el código se ejecuta correctamente, pero cuando consulto la base de datos, los cambios no se guardan.

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)

He intentado configurar conn2.autocommit = True . y también he intentado mover el conn2.commit() dentro del ciclo for para confirmar después de cada iteración. También probé con un controlador diferente {IBM i Access ODBC Driver}

EDITAR:

Muestra de encludeData

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

Después de cambiar la declaración except para captar errores generales, el código anterior ahora produce este error:

IntegrityError (''23000'', ''[23000] [IBM] [Controlador ODBC de System i Access] [DB2 para i5 / OS] SQL0803 - Valor de clave duplicado especificado. (-803) (SQLExecDirectW)'')