2012-01-26 9 views
8

tengo este código:¿Cómo verifico si una inserción fue exitosa con MySQLdb en Python?

cursor = conn.cursor() 
cursor.execute(("insert into new_files (videos_id, filename, " 
       "is_processing) values (%s,%s,1)"), (id, filename)) 
logging.warn("%d", cursor.rowcount) 
if (cursor.rowcount == 1): 
    logging.info("inserted values %d, %s", id, filename) 
else: 
    logging.warn("failed to insert values %d, %s", id, filename) 
cursor.close() 

diversión como es, cursor.rowcount es siempre uno, a pesar de que al día mi base de datos para hacer el videos_id una clave única. Es decir, la inserción falla porque en mis pruebas aparecerá el mismo videos_id (y cuando reviso la base de datos, no se insertó nada). Pero por alguna razón, el rowcount es siempre 1 - incluso el logging.warn tengo escupe un rowcount de 1.

Entonces, la pregunta:
¿Puedo usar rowcount de averiguar si un inserto fue bien? Si es así, ¿qué estoy (presumiblemente) haciendo mal? de lo contrario, ¿cómo puedo verificar si un inserto fue correcto?

Respuesta

22

Su código no se confirma después de las modificaciones (sus modificaciones se retrotraen). Es decir se debe añadir la siguiente línea después cursor.execute:

conn.commit() 

inserción Error lanzará MySQLdb.IntegrityError, por lo que debe estar listo para atraparla.

Por lo tanto, el código debe ser algo como:

sql_insert = """insert into new_files (videos_id, filename, is_processing) 
values (%s,%s,1)""" 

cursor = conn.cursor() 
try: 
    affected_count = cursor.execute(sql_insert, (id, filename)) 
    conn.commit() 
    logging.warn("%d", affected_count) 
    logging.info("inserted values %d, %s", id, filename) 
except MySQLdb.IntegrityError: 
    logging.warn("failed to insert values %d, %s", id, filename) 
finally: 
    cursor.close() 
+0

Eres un campeón, gracias – bharal

+1

Pregunta. ¿Qué sucede si inserta 500 registros a la vez antes de confirmar (ya sea por una consulta larga o múltiples inserciones discretas)? es decir, solo estoy cometiendo cada 500 registros; si uno de esos registros falla, ¿cómo imprimo solo ese registro y continúo insertando los otros? – gunslingor

+0

@ user3656612 depende de por qué fallan. Si el problema es romper algunas restricciones, puede usar INSERT IGNORE or INSERT ... ON DUPLICATE KEY UPDATE. Si se trata de un error de conexión, no puede hacer nada. Si se trata de un error de sintaxis, debería considerar corregir errores en su aplicación. – newtover

1

Si el inserto falla, obtendrá una excepción elevada o alguien gritará o se caerá de la silla.

+0

Odio cuando me caigo de la silla. –

+0

¿hay una manera elegante de atrapar programáticamente las tres posibilidades? – bharal

+1

prueba: Algo: excepto Excepción, e: imprime "falló", str (e) - así que simplemente pon lo que quieras donde esté "Algo". – synthesizerpatel

1

¿Qué le parece usar un bloque try/catch en lugar de mirar rowcount. Si detecta una excepción, entonces hay un problema; de lo contrario, no hay problema.

+0

Soy un poco nuevo en python (y mysqldb), cualquier posibilidad de derrochar en un ejemplo, es decir, ¿qué excepción atrapo en el bloque try catch? – bharal

2

no tengo la reputación suficiente para hacer un comentario, pero aquí es una nota importante:

También es posible ejecutar() fallar silenciosamente si no se compromete después de la llamada. A saber, las tablas MyISAM no requieren la confirmación, pero las de InnoDB sí.

Cuestiones relacionadas