2016-07-14 4 views
2

Ich habe eine MySQL (InnoDB) -Tabelle, die ich vor dem Einfügen neuer Daten abschneiden muss. Wenn jedoch der INSERT aus irgendeinem Grund fehlschlägt, möchte ich auf den Zustand vor dem Abschneiden zurücksetzen (d. H. Die Tabelle darf nicht leer sein).PyMySQL - Rollback nach Ausführung mehrerer Anweisungen

Mit Python 3.5.0 und PyMySQL 0.7.5 habe ich Folgendes gefunden.

import pymysql.cursors 

# Connect to the database 
connection = pymysql.connect(host='xxx', 
          user='xxx', 
          password='xxx', 
          db='tmp', 
          charset='utf8mb4', 
          cursorclass=pymysql.cursors.DictCursor, 
          autocommit=False) 

try: 
    cursor = connection.cursor() 
    cursor.execute("TRUNCATE TABLE `users`;") 
    cursor.execute("ISERT INTO `users` (`email`, `password`) VALUES ('okok', 'foo');") 
except: 
    connection.rollback() 
    connection.close() 
    raise 
else: 
    connection.commit() 
    connection.close() 

Bitte beachte, dass ich einen Tippfehler in der INSERT-Anweisung gemacht habe, um es absichtlich nicht übermitteln, zu überprüfen, ob die TRUNCATE zurückgerollt werden. Dies ist nicht der Fall, wenn die Tabelle Daten enthält, bevor ich dieses Skript ausführe, ist es leer.

Was mache ich falsch? Ist es möglich, einen TRUNCATE auf diese Weise zurückzusetzen?

Antwort

1

TRUNCATE kann nicht zurückgesetzt werden, wie in der MySQL reference erläutert. Sie müssen stattdessen DELETE verwenden.

2

So, basierend auf Arthur Antwort, hier ist das Skript, das funktioniert:

import pymysql.cursors 

# Connect to the database 
connection = pymysql.connect(host='xxx', 
          user='xxx', 
          password='xxx', 
          db='tmp', 
          charset='utf8mb4', 
          cursorclass=pymysql.cursors.DictCursor, 
          autocommit=False) 

try: 
    cursor = connection.cursor() 
    cursor.execute("DELETE FROM `users`;") 
    cursor.execute("ISERT INTO `users` (`email`, `password`) VALUES ('okok', 'foo');") 
except: 
    connection.rollback() 
    connection.close() 
    raise 
else: 
    connection.commit() 
    connection.close() 

Nochmals vielen Dank!