Pourquoi la nécessité d'engager explicitement lorsque vous faites une mise à jour?
Question
Voici mon code:
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()
Si je retire le conn.commit()
, la table est pas mis à jour. Mais pour les instructions select, je ne ai pas besoin que conn.commit()
. Je suis curieux de savoir pourquoi?
La solution
Le DB-API spec nécessite que la connexion à la base de données commence une nouvelle transaction, par défaut. Vous devez commit
pour confirmer toutes les modifications apportées, ou rollback
les jeter.
Notez que si la base de données prend en charge une fonctionnalité de validation automatique, cela doit être d'abord au large.
Déclarations de SELECT
pur, car ils ne font jamais des modifications à la base de données, ne pas avoir leurs changements engagés.
Autres conseils
validation est utilisé pour indiquer la base de données pour enregistrer toutes les modifications de la transaction en cours.
Sélectionnez ne change pas de données donc il n'y a rien à sauver et donc rien à commettre
Voir wikipedia pour les transactions
D'autres ont expliqué pourquoi Commit est pas nécessaire sur une instruction SELECT. Je voulais juste signaler que vous pourriez utiliser la propriété autocommit
du Connexion objet pour éviter d'avoir à exécuter manuellement vous engager:
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()
Ceci est particulièrement utile lorsque vous avez plusieurs INSERT, UPDATE et DELETE dans le même connexion.