【问题标题】:Execute SQLCMD using subprocess python使用子进程 python 执行 SQLCMD
【发布时间】:2015-03-31 12:07:17
【问题描述】:

我想从 .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 循环执行此操作。我尝试使用 subprocess 模块来复制上述指令。不成功。

我的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,但我以同样的错误结束。

【问题讨论】:

    标签: python subprocess sqlcmd


    【解决方案1】:

    删除语句周围的双引号,如下所示:

    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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 2016-05-07
      • 1970-01-01
      • 2019-06-21
      • 2014-06-29
      • 2013-11-02
      相关资源
      最近更新 更多