2016-07-14 493 views
2

我有一個MySQL(InnoDB)表,我需要在插入新數據之前截斷表。但是,如果INSERT因任何原因失敗,我想回滾到截斷前的狀態(即表不能爲空)。PyMySQL - 執行多條語句後回滾

使用Python 3.5.0和PyMySQL 0.7.5,我想出了以下內容。

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() 

注意,我做了一個錯字在INSERT語句中,以使其失敗的宗旨,以檢查是否TRUNCATE可能被回退。情況並非如此,如果在我運行這個腳本之前表中包含數據,它就會變爲空。

我在做什麼錯?這樣可以回滾TRUNCATE嗎?

回答

1

TRUNCATE無法回滾,如MySQL reference中所述。您必須改用DELETE。

2

因此,基於亞瑟的答案,這裏是工作的腳本:

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() 

再次感謝您!