簡體   English   中英

使用子進程python執行SQLCMD

[英]Execute SQLCMD using subprocess python

我想從.dat文件還原MS SQL數據庫。

我通過在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上運行此python腳本時,出現以下錯誤:

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”),但是它也不起作用。

編輯:我確實嘗試在subprocess.call上添加標志shell = True,但是我以相同的錯誤結束。

刪除語句周圍的雙引號,如下所示:

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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM