Database non aggiorna automaticamente con MySQL e Python
-
23-08-2019 - |
Domanda
Sto avendo qualche problema di aggiornare una riga in un database MySQL. Qui è il codice che sto cercando di eseguire:
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()
L'uscita che provo quando corro questo programma è il seguente:
4
Numero di righe aggiornamento: 1
Sembra che funzioni, ma se io interrogare il database dalla riga di comando interfaccia di MySQL (CLI) trovo che non è stato aggiornato a tutti. Tuttavia, se dalla CLI Entro UPDATE compinfo SET Co_num=4 WHERE ID=100;
il database viene aggiornato come previsto.
Qual è il mio problema? Io corro Python 2.5.2 e MySQL 5.1.30 su una scatola di Windows.
Soluzione
Non sono certo, ma ho intenzione di indovinare che si sta utilizzando una tabella INNODB, e non ho fatto un commit. Credo MySQLdb attivare automaticamente le transazioni.
conn.commit()
di chiamata prima di chiamare close
.
Dalla FAQ: a partire dalla 1.2.0, MySQLdb disabilita autocommit di default
Altri suggerimenti
MySQLdb è autocommit off di default, che può essere caotico. esiste la tua connessione nella propria transazione e non sarà in grado di vedere le modifiche apportate da altri collegamenti fino a commettere tale operazione.
È possibile farlo conn.commit()
dopo la dichiarazione di aggiornamento come altri hanno fatto notare, o disattivare questa funzionalità del tutto impostando conn.autocommit(True)
subito dopo aver creato l'oggetto di connessione.
È necessario impegnarsi modifiche manualmente o disattivare la funzione di commit su.
Il motivo SELECT restituisce i dati modificati (ma non persisteva) è perché la connessione è ancora nella stessa transazione.
Ho trovato che il connettore di Python si spegne automaticamente autocommit spento, e non sembra essere un modo per cambiare questo comportamento. Naturalmente è possibile riaccenderlo, ma poi guardando i log di query, lo fa stupidamente due query inutili dopo la collegano a girare autocommit off e riaccenderlo.