我有一个 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?
最佳答案
因此,根据 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()
再次感谢您!
关于mysql - PyMySQL - 执行多条语句后回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38378844/