我有一个关于pyodbc回滚功能的问题,以及我计划如何使用它。
我正在与SQL服务器交互,并执行存储过程列表。但我想尝试将这些存储过程包装成一个try/except to";回滚";这些变化。现在,如果其中一个存储过程失败,那么只要我退出python程序,一切都会恢复。但我想";返回";而不强制关闭应用程序,如下所示。
try:
cursor.execute('exec storedproc1')
cursor.execute('exec storedproc2')
cursor.execute('exec storedproc3')
cursor.execute('exec storedproc4')
connection.commit()
except:
connection.rollback()
上面的代码是否恰当地使用了回滚功能?如果任何一个执行失败并且从未调用connection.commit((,那么上面的代码是否会产生与关闭应用程序相同的结果?
感谢
是的,我相信你做得对。
下面的例程是我用来读取sql文件列表(migration_files
(并在一个事务中执行所有这些文件的一些代码。您可以执行类似的操作并在SP调用上循环。
def run_migration(migration_files):
conn = init_pyodbc_connection(autocommit=False)
conn.autocommit = False
cur = conn.cursor()
for migration_file in migration_files:
with open(migration_file.strip()) as fh:
migrate_sql = fh.read()
try:
cur.execute(migrate_sql)
except:
conn.rollback()
raise
conn.commit()
conn.close()