Не може да се изпълни 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