This link muestra los distintos tipos de errores que puede detectar. MySQLdb.Error
es la clase base estándar de la que se derivan todos los demás errores de MySQL.
Normalmente utilizo MySQLdb.Error
porque le permite concentrarse en los errores relacionados con MySQLdb. Por el contrario StandardError
capturará casi todas las excepciones (no es algo que desee si desea una mejor capacidad de depuración). Además, el uso de MySQLdb.Error
le permite mostrar el mensaje de error exacto (MySQL número de error y todo) para que pueda depurarlo más rápido.
Llegando a la primera parte de la pregunta, en el caso de los enunciados de la base de datos es (por lo general) necesario revertir las transacciones (si son compatibles) en caso de error.
La metodología que sigo es para envolver cada declaración execute
en una cláusula try except (catch MySQLdb.Error
) y usar rollback si hay un error antes de imprimir el mensaje de error y salir.
Sin embargo, hay una trampa. En MySQLdb, los cambios que realice en la base de datos son no realmente escritos en la base de datos hasta que explícitamente se llame a commit. Entonces, lógicamente, la reversión no es necesaria.
A modo de ejemplo,
conn = MySQLdb.connection(db=, host=, passwd=, user=)
cur = conn.cursor()
#Say you have a table X with one entry id = 1 and total = 50
cur.execute("update X set total = 70 where id = 1")
#Actual DB has not yet changed
cur.execute("update X set total = 80 where id = 1")
#Actual DB has still not changed
Si sale del programa sin cometer, el valor en el PP seguirá siendo 50 porque nunca se compromete llamada().
Esta es la forma en que lo ideal sería hacerlo:
conn = MySQLdb.connection(db=, host=, passwd=, user=)
cur = conn.cursor()
#Say you have a table X with one entry id = 1 and total = 50
try:
cur.execute("update X set total = 70 where id = 1")
except MySQLdb.Error,e:
print e[0], e[1]
conn.rollback()
cur.close()
conn.close()
#print lengthy error description!!
sys.exit(2)
#Note: Value in table is still 50
#If you do conn.commit() here, value becomes 70 in table too!!
try:
cur.execute("update X set total = 80 where id = 1")
except MySQLdb.Error,e:
print e[0], e[1]
conn.rollback()
cur.close()
conn.close()
#print lengthy error description!!
sys.exit(2)
#Value in DB will be
#a) 50 if you didn't commit anywhere
#b) 70 if you committed after first execute statement
conn.commit()
#Now value in DB is 80!!
cur.close()
conn.close()
utilizo incluso 'StandardError', y ahora estoy tratando de entender lo que es correcto para estar seguro. – newtover