Perché la necessità di impegnarsi in modo esplicito quando si fa un aggiornamento?
Domanda
Ecco il mio codice:
import cx_Oracle
conn = cx_Oracle.connect(usr, pwd, url)
cursor = conn.cursor()
cursor.execute("UPDATE SO SET STATUS='PE' WHERE ID='100'")
conn.commit()
Se rimuovo il conn.commit()
, la tabella non viene aggiornata. Ma per selezionare le dichiarazioni, non ho bisogno che conn.commit()
. Sono curioso di sapere perchè?
Soluzione
Il DB-API spec richiede che la connessione al database inizia una nuova transazione, per impostazione predefinita. È necessario commit
per confermare le modifiche apportate o rollback
di disfarsene.
Si noti che se il database supporta una funzione di auto-commit, questo deve essere inizialmente spento.
dichiarazioni SELECT
Pure, dal momento che non fanno mai alcuna modifica al database, non c'è bisogno di avere i loro cambiamenti commessi.
Altri suggerimenti
commit viene utilizzato per indicare il database per salvare tutte le modifiche nella transazione corrente.
Seleziona non cambia i dati in modo non c'è nulla da salvare e quindi niente di impegnarsi
wikipedia per le transazioni
Altri hanno spiegato perché un commit non è necessario in un'istruzione SELECT. Volevo solo far notare che si potrebbe utilizzare la proprietà autocommit
del connessione oggetto per evitare di dover eseguire manualmente impegnarsi:
import cx_Oracle
with cx_Oracle.connect(usr, pwd, url) as conn:
conn.autocommit = True
cursor = conn.cursor()
cursor.execute("UPDATE SO SET STATUS='PE' WHERE ID='100'")
cursor.close()
Questo è particolarmente utile quando si dispone di inserire più, UPDATE e DELETE all'interno della stessa connessione.