Python 如何用pyodbc备份数据库

Python 如何用pyodbc备份数据库,python,database,backup,pyodbc,Python,Database,Backup,Pyodbc,当backup语句使用pyodbc游标执行时,不能在事务中使用该语句。pyodbc似乎在默认事务中执行查询。 我还尝试过使用自动提交模式,或者在backup语句之前添加commit语句。这两个都不起作用 #can't execute the backup statement in transaction cur.execute("backup database database_name to disk = 'backup_path'") #not working too cur.execute

当backup语句使用pyodbc游标执行时,不能在事务中使用该语句。pyodbc似乎在默认事务中执行查询。 我还尝试过使用自动提交模式,或者在backup语句之前添加commit语句。这两个都不起作用

#can't execute the backup statement in transaction
cur.execute("backup database database_name to disk = 'backup_path'")
#not working too
cur.execute("commit;backup database database_name to disk = 'backup_path'")
是否可以通过pyodbc执行备份语句?提前谢谢

-----添加了传统信息-----------------------------------------------------------------------

备份操作封装在以下函数中:

def backupdb(con, name, save_path):
    # with autocommit mode, should be pyodbc.connect(con, autocommit=True)
    con = pyodbc.connect(con) 
    query = "backup database %s to disk = '%s'" % (name, save_path)
    cur = con.cursor()
    cur.execute(query)
    cur.commit()
    con.close()
如果该函数由以下代码调用

backupdb('DRIVER={SQL Server};SERVER=.\sqlexpress;DATABASE=master;Trusted_Connection=yes',
             'DatabaseName',
             'd:\\DatabaseName.bak')
那么例外情况将是:

File "C:/Documents and Settings/Administrator/Desktop/bakdb.py", line 14, in <module>'d:\\DatabaseName.bak')
File "C:/Documents and Settings/Administrator/Desktop/bakdb.py", line 7, in backupdb cur.execute(query)
ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot perform a backup or restore operation within a transaction. (3021) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]BACKUP DATABASE is terminating abnormally. (3013)')
文件“C:/Documents and Settings/Administrator/Desktop/bakdb.py”,第14行,在'd:\\DatabaseName.bak'中)
backupdb cur.execute(查询)中第7行的文件“C:/Documents and Settings/Administrator/Desktop/bakdb.py”
编程错误:('42000','[42000][Microsoft][ODBC SQL Server驱动程序][SQL Server]无法在事务中执行备份或还原操作。(3021)(SQLExecDirectW);[42000][Microsoft][ODBC SQL Server驱动程序][SQL Server]备份数据库异常终止。(3013)]

打开关键字autocommit=True时,函数将以静默方式运行,但备份文件夹中没有生成备份文件

假设您使用的是SQL Server,请在建立连接时指定
autocommit=True

>>> import pyodbc
>>> connection = pyodbc.connect(driver='{SQL Server Native Client 11.0}', 
                                server='InstanceName', database='master', 
                                trusted_connection='yes', autocommit=True)
>>> backup = "BACKUP DATABASE [AdventureWorks] TO DISK = N'AdventureWorks.bak'"
>>> cursor = connection.cursor().execute(backup)
>>> connection.close()
这是使用
pyodbc3.0.7
python3.3.2
实现的。我相信对于pyodbc的旧版本,您需要使用它来创建备份文件。例如:

>>> import pyodbc
>>> connection = pyodbc.connect(driver='{SQL Server Native Client 11.0}', 
                                server='InstanceName', database='master', 
                                trusted_connection='yes', autocommit=True)
>>> backup = "E:\AdventureWorks.bak"
>>> sql = "BACKUP DATABASE [AdventureWorks] TO DISK = N'{0}'".format(backup)
>>> cursor = connection.cursor().execute(sql)
>>> while cursor.nextset():
>>>    pass
>>> connection.close()

值得注意的是,对于要使用当前版本的pyodbc和SQL Server 2008 R2创建的备份文件,我不必使用Cursor.nextset()。

在执行备份之前,您是否厌倦了
cur.autocommit=True
?另外,请提供有关数据库的详细信息并向我们显示错误消息。@MichałNiklas,添加了传统信息,谢谢。pyodbc版本是pyodbc-3.0.7。win32-py2.7和python环境是py2.7,我正在XP中使用SQL Express 2005运行备份脚本。正如我在问题中提到的,您的第一个代码片段将触发异常。我将尝试第二种方法。@Erxin请用记录异常详细信息的实际异常文本编辑您的问题,并添加代码段。谢谢你的帮助。:)@Erxin您在发布的示例中没有使用
autocommit=True
。将此添加到连接实例化中,它就会工作。对于我来说,如果不使用
while cursor.nextset():pass
片段,我的备份将运行,但不会报告任何故障,备份文件也不会持久。那些台词使它起作用了。与本期类似: