我有一个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?
答案 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。