我正在使用PyODBC来备份我的数据库,使用以下代码:
SQL_command = """
BACKUP DATABASE [MyDatabase]
TO DISK = N'D:\MSSQL\BACKUP\MyDatabase_20141212.bak' WITH
NOFORMAT
, NOINIT
, NAME = N'MyDatabase_20141212'
, SKIP
, REWIND
, NOUNLOAD
, STATS = 10
"""
conn.cursor.execute(SQL_command)
conn.cursor.commit()
上面的代码给出了一条错误消息:
pyodbc.ProgrammingError:
(' 42000',' [42000] [Microsoft] [ODBC SQL 服务器驱动程序] [SQL Server]无法执行备份或还原操作 在交易中。 (3021)(SQLExecDirectW);
[42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server] BACKUP DATABASE是 异常终止。 (3013)&#39)
我尝试在SQL Server中运行SQL代码,它运行正常。
我可以知道我的代码有什么问题吗?
非常感谢。
答案 0 :(得分:7)
您的错误说
无法在事务中执行备份或还原操作。
事务默认在pyodbc中启动,那么如何在不创建事务的情况下执行查询?只需打开自动提交:
conn.autocommit = true
// do stuff
conn.autocommit = false
pyodbc常见问题解答an entry about this。
答案 1 :(得分:4)
默认情况下,所有pyodbc连接都以事务开头。
您需要打开自动提交 - 使用autocommit关键字连接函数:
conn.autocommit = true
答案 2 :(得分:0)
其他答案是正确的。您确实需要设置自动提交。但是,该事务将完成,但是由于SQL Server中的一个怪癖及其返回状态消息以进行备份和还原操作的方式,因此实际上不会进行备份。
要解决此问题,您需要遍历这些返回消息,直到没有返回消息为止:
SQL_command = """
BACKUP DATABASE [MyDatabase]
TO DISK = N'D:\MSSQL\BACKUP\MyDatabase_20141212.bak' WITH
NOFORMAT
, NOINIT
, NAME = N'MyDatabase_20141212'
, SKIP
, REWIND
, NOUNLOAD
, STATS = 10
"""
conn.cursor.execute(SQL_command)
while conn.cursor.nextset():
pass
conn.cursor.close()