¿Cómo verifico si una inserción fue exitosa con MySQLdb en Python?

Tengo este codigo

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

Por más divertido que sea, cursor.rowcount siempre es uno, aunque actualicé mi base de datos para hacer que videos_id sea una clave única. Es decir, la inserción falla porque en mis pruebas videos_id el mismo videos_id (y cuando videos_id la base de datos, no se insertó nada). Pero por la razón que sea, el logging.warn siempre es 1, incluso el logging.warn que he escupido un logging.warn de 1.

Entonces, la pregunta:
¿Puedo usar el rowcount de rowcount para calcular si un inserto salió bien? Si es así, ¿qué estoy haciendo (probablemente) mal? De lo contrario, ¿cómo compruebo si un inserto salió bien?

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

 conn.commit() 

La inserción fallida lanzará MySQLdb.IntegrityError , por lo que debería estar listo para capturarlo.

Por lo tanto, su código debe verse 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() 

No tengo suficiente reputación para hacer un comentario, pero aquí hay una nota importante:

También es posible que execute () falle silenciosamente si no realiza la confirmación después de la llamada. Es decir, las tablas MyISAM no requieren la confirmación, pero las de InnoDB sí lo requieren.

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

¿Qué hay de usar un bloque try / catch en lugar de mirar el recuento de filas? Si detecta una excepción, entonces hay un problema; De lo contrario, no hay problema.

Almacene la statement de inserción en la cadena e imprímala después. Si ocurre una excepción, la statement no se imprimirá.

 sql_insert = """insert into new_files (videos_id, filename, is_processing) values (%s,%s,1)""" cur.execute(sql_insert) print('Executed:', sql_insert)