Les réponses existantes n'ont pas beaucoup de sens, sauf si vous comprenez ce qu'est une base de données. transaction est. (C'était le cas pour moi jusqu'à récemment).
Parfois, vous pouvez vouloir exécuter plusieurs instructions SQL et les faire réussir ou échouer. dans son ensemble . Par exemple, si vous souhaitez effectuer un virement bancaire du compte A au compte B, vous devrez effectuer deux requêtes comme suit
UPDATE accounts SET value = value - 100 WHERE acct = 'A'
UPDATE accounts SET value = value + 100 WHERE acct = 'B'
Si la première requête réussit mais que la seconde échoue, c'est mauvais (pour des raisons évidentes). Nous devons donc trouver un moyen de traiter ces deux requêtes "comme un tout". La solution consiste à commencer par une instruction BEGIN et à terminer par une instruction COMMIT ou ROLLBACK, comme suit
BEGIN
UPDATE accounts SET value = value - 100 WHERE acct = 'A'
UPDATE accounts SET value = value + 100 WHERE acct = 'B'
COMMIT
Il s'agit d'une transaction unique .
Dans l'ORM de SQLAlchemy, cela pourrait ressembler à ceci
# BEGIN issued here
acctA = session.query(Account).get(1) # SELECT issued here
acctB = session.query(Account).get(2) # SELECT issued here
acctA.value -= 100
acctB.value += 100
session.commit() # UPDATEs and COMMIT issued here
Si vous surveillez quand les différentes requêtes sont exécutées, vous verrez que les UPDATE n'atteignent pas la base de données jusqu'à ce que vous appeliez session.commit()
.
Dans certaines situations, il est préférable d'exécuter les instructions UPDATE avant d'émettre un COMMIT. (Peut-être que la base de données fournit un identifiant auto-incrémenté à l'objet et que vous voulez le récupérer avant de faire un COMMIT). Dans ces cas, vous pouvez explicitement flush()
la session.
# BEGIN issued here
acctA = session.query(Account).get(1) # SELECT issued here
acctB = session.query(Account).get(2) # SELECT issued here
acctA.value -= 100
acctB.value += 100
session.flush() # UPDATEs issued here
session.commit() # COMMIT issued here