我正在尝试使用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代码有什么问题吗?
答案 0 :(得分:1)
我能够重新创建您的特定错误。根据{{3}},必须始终在禁用自动提交的情况下打开数据库连接。换句话说,默认情况下,数据库操作必须始终在事务中发生。
但是,T-SQL DBCC SHRINKFILE
和BACKUP
操作不能在事务中执行,所以我们需要告诉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')
如果您希望能够在运行时调整值,那么您只需将输入参数添加到存储过程。