PyMySQL - 执行多个语句后回滚

时间:2016-07-14 15:54:19

标签: mysql python-3.x

我有一个MySQL(InnoDB)表,我需要在插入新数据之前将其截断。但是如果INSERT因任何原因失败,我想回滚到截断前的状态(即表不能为空)。

使用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?

2 个答案:

答案 0 :(得分:3)

所以,根据Arthur的回答,这是有效的脚本:

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("INSERT INTO `users` (`email`, `password`) VALUES ('okok', 'foo');")
except:
    connection.rollback()
    connection.close()
    raise
else:
    connection.commit()
    connection.close()

再次,谢谢!

答案 1 :(得分:1)

TRUNCATE无法回滚,如MySQL reference中所述。您将不得不使用DELETE。