2015-04-24 2 views
2

Я пытаюсь создать резервную копию моей базы данных с помощью pyodbc.Резервное копирование базы данных MS SQL с pyodbc

Следующий код SQL был проверен и хорошо работал непосредственно в среде SQL Server Management Студия

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 код?

+0

У вас в основном есть две команды, между которыми нет разделителя. Либо отправляйте каждую команду отдельно, либо помещайте разделитель (GO или;) между ними. Также, если pyOdbc имеет метод executeNonQuery, который будет вам нужен, запрос не будет возвращать строки, и ошибка, кажется, предполагает, что он ожидает некоторых. –

ответ

1

Я смог воссоздать вашу конкретную ошибку. Согласно 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') 

Если вы хотите, чтобы иметь возможность tweak значения во время выполнения, то вы можете просто добавить входные параметры в хранимую процедуру.

Смежные вопросы