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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top