2013-07-20 16 views
6

Ho provato a utilizzare PyMysql e finora tutto ciò che ho fatto ha funzionato (Select/insert) ma quando provo ad aggiornarlo non funziona, nessun errore niente, semplicemente non fa nulla.PyMysql UPDATE query

import pymysql 
connection = pymysql.connect(...) 
cursor = connection.cursor() 
cursor.execute("UPDATE Users SET IsConnected='1' WHERE Username='test'") 
cursor.close() 
connection.close() 

e sì che ho ricontrollato che gli utenti, IsConnected e nome utente sono tutti corretti e prova non esiste (SELECT opere su di esso)

qual è il mio problema?

+1

Sospetto che pymysql stia avviando automaticamente una transazione che non si sta impegnando in modo esplicito, quindi il suo rollback quando si chiude la connessione. –

+0

Quindi cosa dovrei fare per risolverlo? rimuovere il cursore.close() connection.close()? – Shay

+3

prova una chiamata a 'connection.commit()' dopo la chiamata a 'cursor.execute()' –

risposta

12

Quando si esegue l'aggiornamento, MySQL sta avviando implicitamente una transazione. È necessario eseguire il commit della transazione chiamando connection.commit() dopo aver eseguito l'aggiornamento per impedire il rollback automatico della transazione al momento della disconnessione.

MySQL (almeno quando si utilizza il motore InnoDB per le tabelle) supporta transactions, che consentono di eseguire una serie di istruzioni di aggiornamento/inserimento poi li hanno o tutti commettono in una volta in modo efficace come una singola operazione, o di rollback in modo che nessuno sono applicate. Se non si esegue il commit esplicito di una transazione, verrà eseguito il rollback automaticamente quando si chiude la connessione al database.

10

In effetti, ciò che @JoeDay ha descritto sopra ha poco a che fare con il comportamento predefinito della transazione MySQL. MySQL di default opera in auto-commit mode e normalmente non è necessario alcun ulteriore tocco a persistere le modifiche:

Per impostazione predefinita, MySQL viene eseguito con modalità autocommit attivata. Ciò significa che non appena si esegue un'istruzione che aggiorna (modifica) una tabella, MySQL memorizza l'aggiornamento su disco per renderlo permanente. La modifica non può essere ripristinata.

del PEP-249 (DB API) gli autori hanno deciso di complicare le cose e rompere Zen di Python facendo inizio di una transazione implicita, proponendo auto-commit essere disabilitato per impostazione predefinita.

Quello che suggerisco di fare è ripristinare il comportamento predefinito di MySQL. E usa le transazioni esplicitamente, solo quando ne hai bisogno.

import pymysql 

connection = pymysql.connect(autocommit=True) 

Ho anche scritto su di esso here con alcuni riferimenti.

+0

Questa è la migliore risposta! – radtek

Problemi correlati