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

问题描述 投票:1回答:1

我试图写一个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脚本时,没有抛出任何错误,在预期的位置('D:testtest_db.BAK')可以暂时看到BAK文件,但是当脚本运行完成后,BAK文件消失了(???)。有谁知道为什么会出现这种情况?

python pyodbc
1个回答
2
投票

解决方法,如在 这个GitHub问题,就是叫 .nextset() 在执行完 BACKUP 语句......。

crsr.execute(backup_statement)
while (crsr.nextset()):
    pass

...来 "消耗 "进度信息,由 BACKUP. 如果这些消息在连接关闭之前没有被消耗掉,那么SQL Server就会认为出了问题,并取消备份。

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

© www.soinside.com 2019 - 2024. All rights reserved.