使用pyodbc备份MS SQL数据库

时间:2015-04-24 10:35:50

标签: python sql sql-server database-backups pyodbc

我正在尝试使用pyodbc备份我的数据库。

以下SQL代码已在SQL Server Management Studio中直接测试并运行良好

DBCC SHRINKFILE(MyDB_v0_log, 100)
GO

BACKUP DATABASE comparables
TO  DISK = N'D:\MSSQL\BACKUP\MyDB_v0_noFSD.bak' WITH NOFORMAT
,   INIT
,   NAME = N'backup_MyDB_v0_noFSD.bak', SKIP, REWIND, NOUNLOAD
,   STATS = 10

以下代码是我在Python中尝试的代码

conn = pyodbc.connect("driver={SQL Server};server=MyServer;database=MyDB;trusted_connection=true") 

cursor = conn.cursor()

SQL_command = """
                DBCC SHRINKFILE(comparables_v0_log, 100)

                BACKUP DATABASE MyDB
                TO  DISK = N'D:\MSSQL\BACKUP\MyDB_v0_noFSD.bak' WITH NOFORMAT
                ,   INIT
                ,   NAME = N'backup_MyDB_v0_noFSD.bak', SKIP, REWIND, NOUNLOAD
                ,   STATS = 10
              """

cursor.execute(SQL_command)
cursor.commit()

但是,上面的代码会生成错误:

  

pyodbc.Error:(' HY007',' [HY007] [Microsoft] [ODBC SQL Server   驱动程序]关联语句未准备好(0)(SQLNumResultCols)')

我可以知道我的Python代码有什么问题吗?

1 个答案:

答案 0 :(得分:1)

我能够重新创建您的特定错误。根据{{​​3}},必须始终在禁用自动提交的情况下打开数据库连接。换句话说,默认情况下,数据库操作必须始终在事务中发生。

但是,T-SQL DBCC SHRINKFILEBACKUP操作不能在事务中执行,所以我们需要告诉pyodbc我们想要启用自动提交,我们可以用

cnxn = pyodbc.connect(my_connection_string, autocommit=True);

当我进行更改时,错误消失了,但备份仍然没有发生。我不确定为什么会这样,因为我可以从其他ODBC连接(例如,来自VBScript)做同样的事情,并且它在那里工作。

一种解决方法是在SQL Server数据库中创建存储过程,例如

CREATE PROCEDURE dbo.doShrinkAndBackup
AS
BEGIN
    SET NOCOUNT ON;

    DBCC SHRINKFILE(myDb_log, 100);

    BACKUP DATABASE myDb
    TO  DISK = N'C:\__tmp\myDb.bak' WITH NOFORMAT
    ,   INIT
    ,   NAME = N'myDb backup', SKIP, REWIND, NOUNLOAD
    ,   STATS = 10;
END

然后从Python调用存储过程

cnxn = pyodbc.connect(my_connection_string, autocommit=True);
crsr = cnxn.cursor()
crsr.execute('EXEC dbo.doShrinkAndBackup')

如果您希望能够在运行时调整值,那么您只需将输入参数添加到存储过程。