2013-10-29 90 views
0

我試圖使用下面的代碼連接到SQL服務器我收到錯誤無效的參數。我試圖從一個SQL文件中讀取,並使用sqlcmd在popen創建的會話上運行查詢。無法通過在Python中使用POPEN創建的會話執行sql命令

我的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

回答

1

試試這個(添加殼=真):

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

,或者你可以,你可以給你的字符串添加sqlcmd.exe的顯式路徑...

+0

非常感謝。我認爲這是不好的使用python提供此警告消息。警告 如果與不可信輸入結合使用,調用shell = True的系統shell可能會帶來安全隱患。 – Hemant

+0

如果我不想使用shell = True,我該如何提供sqlcmd路徑? – Hemant

+1

例如我在這裏有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)' – Ernst