2015-02-01 6 views
2

Я хочу восстановить базу данных MS SQL из файла .dat.Выполнение SQLCMD с использованием подпроцесса python

Я сделал это успешно, вызвав следующую команду/заявление о Windows PowerShell или сохранить его в .bat файл и запустить сам файл:

sqlcmd -S POLIVEIRA-PC\MSSQLSERVER2008 -Q "RESTORE DATABASE [Odemira_2012-07-01_021501] FROM DISK=N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER2008\MSSQL\Backup\ODEMIRA2013\Odemira_2012-07-01_021501' WITH FILE=1, MOVE N'Odemira_Data' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER2008\MSSQL\DATA\Odemira_2012-07-01_021501.MDF', MOVE N'Odemira_Log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER2008\MSSQL\DATA\Odemira_2012-07-01_021501_1.LDF', NOUNLOAD, STATS=10" 

Однако, так как мне нужно повторить это несколько раз с разными базами данных, я бы хотел использовать Python для этого в цикле. Я попытался использовать модуль подпроцесса для репликации приведенной выше инструкции. Unsuccessefully.

Мой Python код выглядит следующим образом:

import subprocess 

host = 'POLIVEIRA-PC\\MSSQLSERVER2008' 
mssql_dir = 'C:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER2008\\MSSQL\\DATA\\' 
db_dir = 'C:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER2008\\MSSQL\\Backup\\ODEMIRA2013\\' 
db = 'Odemira_2012-07-01_021501' 

statement = '"RESTORE DATABASE [' + db + '] FROM DISK=N\'' + db_dir + \ 
      db + '\' WITH FILE=1, MOVE N\'Odemira_Data\' TO N\'' + mssql_dir + \ 
      db + '.MDF\', MOVE N\'Odemira_Log\' TO N\'' + mssql_dir + \ 
      db + '_1.LDF\', NOUNLOAD, STATS=10"' 

subprocess.call(["sqlcmd", "-S", host, "-Q", statement]) 

Когда я запускаю этот питон скрипт на Windows PowerShell, я получаю следующее сообщение об ошибке:

PS C:\Users\POliveira\Dropbox\Academia\IST\Dissertacao_de_Mestrado\SQL> python .\lib\temp.py 
Sqlcmd: 'RESTORE DATABASE [Odemira_2012-07-01_021501] FROM DISK=N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER2008\MSSQL\Backup\ODEMIRA2013\Odemira_2012-07-01_021501' WITH FILE=1, MOVE N'Odemira_Data' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER2008\MSSQL\DATA\Odemira_2012-07-01_021501.MDF', MOVE N'Odemira_Log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER2008\MSSQL\DATA\Odemira_2012-07-01_021501_1.LDF', NOUNLOAD, STATS=10\""': Unexpected argument. Enter '-?' for help. 

Я не знаю, что мне не хватает , Я попытался избежать двойных кавычек («RESTORE ... 10») с помощью backslahes, но это тоже не сработало.

EDIT: Я попытался добавить флаг shell = True в subprocess.call, но я закончил с той же ошибкой.

ответ

3

Удалите двойные кавычки вокруг заявления, как это:

statement = 'RESTORE DATABASE [' + db + '] FROM DISK=N\'' + db_dir + \ 
      db + '\' WITH FILE=1, MOVE N\'Odemira_Data\' TO N\'' + mssql_dir + \ 
      db + '.MDF\', MOVE N\'Odemira_Log\' TO N\'' + mssql_dir + \ 
      db + '_1.LDF\', NOUNLOAD, STATS=10'