Python 用pyodbc备份MS-SQL数据库
我正在尝试用pyodbc备份我的数据库 以下SQL代码已经过测试,并且直接在SQLServerManagementStudio中运行良好Python 用pyodbc备份MS-SQL数据库,python,sql,sql-server,database-backups,pyodbc,Python,Sql,Sql Server,Database Backups,Pyodbc,我正在尝试用pyodbc备份我的数据库 以下SQL代码已经过测试,并且直接在SQLServerManagementStudio中运行良好 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
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()
但是,上述代码会生成一个错误:
错误:('HY007','HY007][Microsoft][ODBC SQL Server
驱动程序]关联语句未准备(0)(SQLNumResultCols)“”)
我可以知道我的Python代码有什么问题吗?我可以重新创建您的特定错误。根据,数据库连接必须始终在禁用自动提交的情况下打开。换句话说,默认情况下,数据库操作必须始终发生在事务中 但是,T-SQL
DBCC SHRINKFILE
和BACKUP
操作不能在事务中执行,因此我们需要告诉pyodbc我们希望启用自动提交,我们可以使用它
cnxn=pyodbc.connect(我的连接字符串,autocommit=True);
当我做出更改时,错误消失了,但备份仍然没有发生。我不确定这是为什么,因为我可以从其他ODBC连接(例如,从VBScript)执行相同的操作,并且它在那里工作
一种解决方法是在SQL Server数据库中创建存储过程,例如
创建过程dbo.doShrinkAndBackup
作为
开始
不计数;
DBCC收缩文件(myDb_日志,100);
备份数据库myDb
TO DISK=N'C:\\ uu tmp\myDb.bak',格式为NOFORMAT
,INIT
,NAME=N'myDb backup',跳过、倒带、加载
,STATS=10;
结束
然后从Python调用存储过程
cnxn=pyodbc.connect(我的连接字符串,autocommit=True);
crsr=cnxn.cursor()
crsr.execute('EXEC dbo.doShrinkAndBackup')
如果您希望能够在运行时调整值,那么只需将输入参数添加到存储过程中即可。基本上有两个命令,它们之间没有分隔符。或者单独发送每个命令,或者在它们之间放置一个分隔符(GO或;)。此外,如果pyOdbc具有您需要的ExecuteOnQuery方法,则查询将不返回任何行,并且错误似乎表明它需要一些行。