2009-09-20 19 views
9

Soy nuevo en el adaptador MySQL de Python y Python. No estoy seguro de si me falta algo obvio aquí:Python MySQL - SELECT funciona, pero no DELETE?

db = MySQLdb.connect(# db details omitted) 
cursor = self.db.cursor() 

# WORKS 
cursor.execute("SELECT site_id FROM users WHERE username=%s", (username)) 
record = cursor.fetchone() 

# DOES NOT SEEM TO WORK 
cursor.execute("DELETE FROM users WHERE username=%s", (username)) 

¿Alguna idea?

+3

qué privilegios tiene usted sobre las bases de datos? – ennuikiller

+0

sí, asegúrese de que el usuario que está utilizando tenga los derechos para eliminar filas. –

+0

Cuando dices "NO PARECE TRABAJAR": ¿cómo lo sabes? ¿Recibes algún tipo de mensaje de error? ¿Si es así, Cuál? Por favor, informe todos los detalles por adelantado. –

Respuesta

12

Supongo que está utilizando un motor de almacenamiento que admite transacciones (por ejemplo, InnoDB) pero no llama al db.commit() después del BORRAR. El efecto del DELETE se descarta si no se compromete.

Ver http://mysql-python.sourceforge.net/FAQ.html#my-data-disappeared-or-won-t-go-away:

A partir de 1.2.0, MySQLdb desactiva confirmación automática por defecto, como lo requiere la la norma DB-API (PEP-249). Si está utilizando tablas InnoDB o algún otro tipo de tipo de tabla transaccional, tendrá que hacer Connection.commit() antes de cerrar la conexión, o de lo contrario ninguno de sus cambios se escribirán a la base de datos.

Ver también esto similar SO pregunta: Python MySQLdb update query fails

+0

¡Bingo! Esta es la cosa específica de Python que estaba buscando, porque lo anterior habría funcionado directamente en PHP o Ruby sin ningún problema. ¡Gracias chicos! –

+0

me rompió la cabeza con esto ayer ... tomó un tiempo averiguar por qué. ¿Crees que hay una ganancia de rendimiento de cometer todo a la vez? es decir, ¿en lugar de eliminar para cada instancia en un bucle for, confirmar al final antes de cerrar? – Cmag

+1

Sí, definitivamente hay una ganancia de rendimiento. Por ejemplo, la configuración predeterminada para InnoDB hace un 'fsync()' después de cada transacción confirmada. Ver http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit –

0

Para su código anterior, simplemente añadir una llamada a self.db.commit().

La característica está lejos de ser una molestia:

Se le salva de la corrupción de datos emite cuando hay errores en sus consultas.

1

Quizás esté infringiendo una restricción de clave externa.

0

El problema podría ser que no está realizando los cambios. se puede hacer por conn.commit()

leer más sobre este here

Cuestiones relacionadas