Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用pyodbc备份MS-SQL数据库_Python_Sql_Sql Server_Database Backups_Pyodbc - Fatal编程技术网

Python 用pyodbc备份MS-SQL数据库

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

我正在尝试用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, 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方法,则查询将不返回任何行,并且错误似乎表明它需要一些行。