python - 使用 pyodbc 备份 MS SQL 数据库

标签 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 Driver]Associated statement is not prepared (0) (SQLNumResultCols)')

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

最佳答案

我能够重现您的特定错误。根据Python Database API Spec ,数据库连接必须始终在禁用自动提交的情况下打开。换句话说,默认情况下,数据库操作必须始终发生在事务中。

但是,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')

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

关于python - 使用 pyodbc 备份 MS SQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29845246/

相关文章:

迭代列表的一部分的pythonic方法

php - 处理在 MySQL 中存储为 JSON 对象的数据

sql-server - 如何使用Golang SDK查询RDS的任何表格

python - HBase-HappyBase : Socket Timeout Error For Larger Files - Works Good With Smaller one's

python - 使用python提供应用服务

python - 如何从列表中选择单个表达式

sql - 如何使表列在插入时始终使用默认值?

c# - 将 boolean 参数传递给 SQL Server 存储过程

c# - 设置单用户模式恢复备份

sql-server - 插入SQL服务器