Невозможно выполнить команду sql через сеанс, созданный с использованием POPEN в python

Я пытаюсь подключиться к SQL-серверу, используя приведенный ниже код. Я получаю сообщение об ошибке с недопустимым аргументом. Я пытаюсь прочитать из файла sql и выполнить запрос в сеансе, созданном popen с помощью sqlcmd.

Мой файл SQL содержит этот код -

select @@version;

GO

это мой код Python для подключения и запуска команды. Я получаю сообщение "[Errno 22] Неверный аргумент"

import os
import subprocess
from subprocess import Popen, PIPE, STDOUT

def ms_sql_session():
    ip_addr = "xxx.xxx.xxx.xxx,1433"
    user = 'sa'
    password = 'password'
    connection_string = 'sqlcmd -S %s -U %s -P %s' %(ip_addr, user, password)

    try:
        session = Popen(connection_string, stdin=PIPE, stdout=PIPE, stderr=PIPE)
        f = open('abc.sql','r')
        str_cmd = f.read()
        session.stdin.write(str_cmd)
        stdout, stderr = session.communicate()
        print stdout
        print stderr
        return True
    except Exception, e:
        print str(e)
        return False

ms_sql_session()

Как я могу дегугировать такую ​​​​ситуацию. Я новичок в sql, поэтому я не уверен, что это проблема с моим кодом или с тем, как работает stdin.

Я могу запустить команду с помощью утилиты sqlcmd в командной строке. Я использую sqlcmd для sql 2005


person Hemant    schedule 29.10.2013    source источник


Ответы (1)


попробуйте это (добавьте shell=True):

session = Popen(connection_string, stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=True)

или вы можете добавить явный путь к sqlcmd.exe в свою строку...

person Ernst    schedule 29.10.2013
comment
большое спасибо. Я думал, что это нехорошо использовать, поскольку python предоставляет это предупреждающее сообщение. Предупреждение Вызов системной оболочки с shell = True может быть угрозой безопасности в сочетании с ненадежным вводом. - person Hemant; 29.10.2013
comment
также как я могу указать путь sqlcmd, если я не хочу использовать shell = True? - person Hemant; 29.10.2013
comment
Например, у меня есть sqlcmd здесь: C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE Так что это должно сработать для вас: connection_string = 'C:\\Program Files\\Microsoft SQL Server\\100\\Tools\\Binn\\SQLCMD.EXE -S %s -U %s -P %s' %(ip_addr, user, password) - person Ernst; 29.10.2013