我正在尝试使用 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 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')
如果您希望能够在运行时调整值,那么您只需将输入参数添加到存储过程即可。
关于python - 使用 pyodbc 备份 MS SQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29845246/