用于创建SQL Server数据库备份文件的Python脚本(使用pyodbc)

用于创建SQL Server数据库备份文件的Python脚本(使用pyodbc),python,pyodbc,Python,Pyodbc,我正在尝试编写一个python脚本来备份SQL Server数据库,然后将其恢复到一个新的数据库中 在SQL Server中运行时,SQL脚本本身似乎工作正常: BACKUP DATABASE TEST_DB TO DISK = 'D:/test/test_db.BAK'; 但是,当我尝试从python脚本运行它时,它失败了: con = pyodbc.connect('UID=xx; PWD=xxxxxx, driver='{SQL Server}', server=r'xxxxxx', d

我正在尝试编写一个python脚本来备份SQL Server数据库,然后将其恢复到一个新的数据库中

在SQL Server中运行时,SQL脚本本身似乎工作正常:

BACKUP DATABASE TEST_DB
TO DISK = 'D:/test/test_db.BAK';
但是,当我尝试从python脚本运行它时,它失败了:

con = pyodbc.connect('UID=xx; PWD=xxxxxx, driver='{SQL Server}', server=r'xxxxxx', database='TEST_DB')
sql_cursor = con.cursor()
query = ("""BACKUP DATABASE TEST_DB
            TO DISK = 'D:/test/test_db.BAK';""")
con.autocommit = True
sql_cursor.execute(query1)
con.commit()
首先,如果我不添加行“con.autocommit=True”,它将失败,并显示以下消息:

Cannot perform a backup or restore operation within a transaction. (3021)
不知道什么是交易。我在另一篇文章中读到,行“con.autocommit=True”删除了错误,事实上确实如此。我不知道为什么


最后,当我在con.autocommit设置为True的情况下运行python脚本时,不会抛出任何错误,可以在预期的位置临时看到BAK文件('D:/test/test_db.BAK'),但当脚本完成运行时,BAK文件消失(????)。有人知道为什么会发生这种情况吗?

如中所述,解决方案是在执行
备份
语句后重复调用
.nextset()

crsr.execute(backup_语句)
while(crsr.nextset()):
通过
。。。“使用”备份发出的进度消息。如果在连接关闭之前未使用这些消息,则SQL Server会发现出现了问题并取消备份


SSM显然可以直接捕获这些消息,但是ODBC连接必须调用ODBC
SQLMoreResults
函数来检索每条消息,这就是我们调用pyodbc
.nextset()方法时发生的情况。

解决了问题。谢谢但是,我不明白为什么直接在SSM上运行查询时不会发生此问题。