Pregunta

Estoy teniendo algunos problemas para actualizar un registro en una base de datos MySQL. Aquí está el código que estoy tratando de ejecutar:

import MySQLdb

conn=MySQLdb.connect(host="localhost", user="root", passwd="pass", db="dbname")
cursor=conn.cursor()

cursor.execute("UPDATE compinfo SET Co_num=4 WHERE ID=100")
cursor.execute("SELECT Co_num FROM compinfo WHERE ID=100")
results = cursor.fetchall()

for row in results:
    print row[0]

print "Number of rows updated: %d" % cursor.rowcount

cursor.close()
conn.close()

La salida consigo cuando corro este programa es:

  

4 Número de filas
actualización: 1

Parece que está funcionando pero si consultar la base de la interfaz de línea de comandos de MySQL (CLI) me parece que no se ha actualizado en absoluto. Sin embargo, si desde la CLI entro UPDATE compinfo SET Co_num=4 WHERE ID=100; la base de datos se actualiza como se esperaba.

¿Cuál es mi problema? Estoy corriendo Python 2.5.2 con MySQL 5.1.30 en una máquina Windows.

¿Fue útil?

Solución

No estoy seguro, pero voy a adivinar que está utilizando una tabla InnoDB, y no lo ha hecho un commit. Creo MySQLdb permiten automáticamente las transacciones.

conn.commit() llamada antes de llamar close.

Desde el FAQ: a partir de 1.2.0, MySQLdb inhabilita la confirmación automática por defecto

Otros consejos

MySQLdb ha Autocommit desactivada por defecto, que puede ser confuso al principio. Su conexión existe en su propia transacción y usted no será capaz de ver los cambios que realice a partir de otras conexiones hasta que confirme la transacción.

Usted puede hacer conn.commit() después de la instrucción de actualización como otros han señalado, o desactivar esta funcionalidad por completo mediante el establecimiento de conn.autocommit(True) justo después de crear el objeto de conexión.

Es necesario confirmar los cambios de forma manual o desactivar la opción de cometer sucesivamente.

La razón SELECT devuelve los datos modificados (pero no persistido) se debe a que la conexión se encuentra todavía en la misma transacción.

Me he dado cuenta que el conector de Python se apaga automáticamente la confirmación automática, y no parece haber ninguna manera de cambiar este comportamiento. Por supuesto se puede volver a activarlo, pero luego mirar los registros de consultas, estúpidamente hace dos consultas sin sentido después se conectan a su vez el compromiso automático y vuelva a encenderla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top