2009-06-22 14 views
13

OK. Ho costruito qui un browser di query mysql, come navicat. Utilizzo di MySQLdb per eseguire query.La query di aggiornamento Python MySQLdb non riesce

Ecco la parte strana. Quando eseguo la query attraverso il programma (usando MySQLdb), mi dà successo, rows = 1 interessato, ma quando lo guardo in phpmyadmin, il valore non è cambiato.

quindi prima di eseguire la query, stampo, copio e incollo nella finestra di query di phpmyadmin, premo e funziona. Per farla breve, la query di aggiornamento non funziona, ma quando copio e incollo in phpmyadmin, funziona.

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) 

Ed ecco la parte della classe 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 

Quindi, tutte le idee che cosa potrebbe accadere?

+2

vi ringrazio per questo ho avuto l'esatta domanda – KacieHouser

risposta

16

Un'ipotesi: forse il codice in Python è in esecuzione all'interno di una transazione e potrebbe essere necessario impegnare esplicitamente la transazione?

Modifica: C'è un entry in the MySQLdb FAQ che potrebbe essere rilevante.

+2

+1: No commettere significa che il cambiamento è invisibile a tutti gli altri. –

+0

Sì. era questo. Mille grazie! – sqram

19

Credo che @Jason Creighton e @ S.Lott siano corretti.

Almeno se la tabella che si sta aggiornando si trova su un motore di archiviazione transazionale. InnoDB è transazionale, ISAM no.

È necessario chiamare lo commit() sull'oggetto di connessione prima di chiuderlo oppure è necessario impostare la connessione in modalità di autocommit. Non sono sicuro di come lo fai per una connessione MySQLdb, immagino che tu possa impostare un argomento per il costruttore della connessione, o impostare una proprietà dopo aver creato l'oggetto di connessione.

Qualcosa di simile:

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

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

Ah, capisco. Sì, questo era il problema. Anche se hai postato la risposta in modo semplice, dovrò contrassegnare Jason come accettato, come prima ha risposto, con un link alla soluzione. Grazie mille però, lo darò 1+! :) – sqram

+2

Sì! La tua seconda ipotesi è quella giusta - conn.autocommit (True) funziona (anche se i commit espliciti sono ancora migliori ;-). –

Problemi correlati