2009-06-22 31 views
13

Bien. He creado aquí un buscador de consultas mysql, como navicat. Usando MySQLdb para realizar consultas.La consulta de actualización Python MySQLdb falla

Aquí está la parte extraña. Cuando ejecuto la consulta a través del programa (usando MySQLdb), me da éxito, las filas afectadas = 1, pero cuando lo miro en phpmyadmin, el valor no ha cambiado.

así que antes de realizar la consulta, la imprimo, la copio y la pego en la ventana de búsqueda de phpmyadmin, pulso "ir" y funciona. Así que, cuento corto, la consulta de actualización no funciona, pero cuando copio y pego en phpmyadmin, funciona.

self.tbl.sql.use(self.tbl.database)  # switches to correct database. I've printed this and it uses the corrected db 
if self.tbl.sql.execute(query) == True: 
    print sql_obj.rows_affected()   # returns 1 (since i only do 1 query) 

Y aquí es la parte de la clase de SQL

def execute(self, query): 

    try: 
     self.cursor.execute(query) 
     return True 
    except MySQLdb.ProgrammingError as error: 
     print "---->SQL Error: %s" % error 
     return False 
    except MySQLdb.IntegrityError as e: 
     print "--->SQL Error: %s" % e  
     return False 

Así que cualquier idea lo que podría estar sucediendo?

+2

gracias por esto tuve la pregunta exacta – KacieHouser

Respuesta

16

Solo una suposición: Quizás el código en Python se está ejecutando dentro de una transacción, y la transacción podría necesitar ser explícitamente confirmada.

Editar: Hay un entry in the MySQLdb FAQ que podría ser relevante.

+2

1: No se cometen significa el cambio es invisible a todos los demás. –

+0

Sí. Esto fue. ¡Muchas gracias! – sqram

19

Creo que @Jason Creighton y @ S.Lott son correctos.

Al menos, si la tabla que está actualizando se encuentra en un motor de almacenamiento transaccional. InnoDB es transaccional, ISAM no es.

O bien tiene que llamar al commit() en su objeto de conexión antes de cerrarlo, o debe establecer la conexión al modo de confirmación automática. No estoy seguro de cómo hacerlo para una conexión MySQLdb, supongo que estableces un argumento para el constructor de la conexión o configuras una propiedad después de crear el objeto de conexión.

Algo así como:

conn = mysql.connection(host, port, autocommit=True) 

# or 
conn = mysql.connection(host, port) 
conn.autocommit(True) 
+0

Ahh ya veo. Sí, este era el problema. Aunque publicó la respuesta correcta, tendré que marcar la de Jason como la aceptada, ya que respondió primero, con un enlace a la solución. ¡Muchas gracias, le daré 1+! :) – sqram

+2

¡Sip! Su segunda suposición es la correcta: conn.autocommit (True) funciona (aunque los commits explícitos son aún mejores ;-). –