2016-07-14 10 views
2

新しいデータを挿入する前に切り捨てる必要があるMySQL(InnoDB)テーブルがあります。しかし、何らかの理由でINSERTが失敗した場合は、切り捨て前の状態にロールバックしたい(つまり、テーブルを空にすることはできません)。PyMySQL - 複数の文を実行した後のロールバック

Python 3.5.0とPyMySQL 0.7.5を使用して、私は以下を考え出しました。私はそれがTRUNCATEをロールバックすることができているかどうかを確認するために、意図的に失敗させるためにINSERT文でタイプミスをした

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

注意。これはそうではありません。このスクリプトを実行する前にテーブルにデータが含まれていれば、空になります。

私は間違っていますか? TRUNCATEをこのようにロールバックすることは可能ですか?

答えて

1

MySQL referenceで説明されているように、TRUNCATEはロールバックできません。代わりに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() 

、ありがとうございました!

関連する問題