在 PyMySQL 中回滚多个查询
Rollback multiple queries in PyMySQL
已发布与此类似的问题,但不幸的是 none 的建议解决方案对我有用。
我想看看是否可以在一个 try 子句中编写两个查询,并在其中一个抛出异常时让它们都回滚。为了确保抛出异常,我只是尝试创建相同的 table 两次。
def function():
try:
cursor = connection.cursor()
q1 = "CREATE TABLE 0_test_table (column1 varchar(255))"
cursor.execute(q1)
q1 = "CREATE TABLE 0_test_table (column1 varchar(255))"
cursor.execute(q1)
except pymysql.Error as e:
print("Exception encountered")
print(e)
try:
connection.rollback()
except:
print("rollback failed")
pass
else:
connection.commit()
connection.close()
function()
其中打印:
Exception encountered
(1050, "Table '0_test_table' already exists")
由于异常是由查询引发的,而不是由回滚引发的,我认为它一定是回滚了更改。我检查了数据库,table 已经创建。为什么回滚不起作用?这也引出了关于 commit 方法的作用的问题。因为我在我的代码中从来没有接触过 else,所以我从来没有接触过提交方法,但事情显然已经提交了。
我试图改编我在 O'Reilly 网站 here 上找到的一个例子。这让我有:
def function():
try:
connection.begin()
cursor = connection.cursor()
q1 = "CREATE TABLE 0_test_table (column1 varchar(255))"
cursor.execute(q1)
q1 = "CREATE TABLE 0_test_table (column1 varchar(255))"
cursor.execute(q1)
cursor.close()
connection.commit()
except pymysql.Error as e:
print("Exception encountered")
print(e)
try:
connection.rollback()
except:
print("rollback failed")
pass
function()
再次打印:
Exception encountered
(1050, "Table '0_test_table' already exists")
又一次在数据库中创建了 table。
正如您在引用中看到的那样,A ROLLBACK
of a CREATE TABLE
无法完成。
"The CREATE TABLE statement in InnoDB is processed as a single transaction. This means that a ROLLBACK from the user does not undo CREATE TABLE statements the user made during that transaction."
已发布与此类似的问题,但不幸的是 none 的建议解决方案对我有用。
我想看看是否可以在一个 try 子句中编写两个查询,并在其中一个抛出异常时让它们都回滚。为了确保抛出异常,我只是尝试创建相同的 table 两次。
def function():
try:
cursor = connection.cursor()
q1 = "CREATE TABLE 0_test_table (column1 varchar(255))"
cursor.execute(q1)
q1 = "CREATE TABLE 0_test_table (column1 varchar(255))"
cursor.execute(q1)
except pymysql.Error as e:
print("Exception encountered")
print(e)
try:
connection.rollback()
except:
print("rollback failed")
pass
else:
connection.commit()
connection.close()
function()
其中打印:
Exception encountered
(1050, "Table '0_test_table' already exists")
由于异常是由查询引发的,而不是由回滚引发的,我认为它一定是回滚了更改。我检查了数据库,table 已经创建。为什么回滚不起作用?这也引出了关于 commit 方法的作用的问题。因为我在我的代码中从来没有接触过 else,所以我从来没有接触过提交方法,但事情显然已经提交了。
我试图改编我在 O'Reilly 网站 here 上找到的一个例子。这让我有:
def function():
try:
connection.begin()
cursor = connection.cursor()
q1 = "CREATE TABLE 0_test_table (column1 varchar(255))"
cursor.execute(q1)
q1 = "CREATE TABLE 0_test_table (column1 varchar(255))"
cursor.execute(q1)
cursor.close()
connection.commit()
except pymysql.Error as e:
print("Exception encountered")
print(e)
try:
connection.rollback()
except:
print("rollback failed")
pass
function()
再次打印:
Exception encountered
(1050, "Table '0_test_table' already exists")
又一次在数据库中创建了 table。
正如您在引用中看到的那样,A ROLLBACK
of a CREATE TABLE
无法完成。
"The CREATE TABLE statement in InnoDB is processed as a single transaction. This means that a ROLLBACK from the user does not undo CREATE TABLE statements the user made during that transaction."