2016-02-25 160 views
0

我想使用argparse從參數中解析一個值。當我用「打印」測試我的條件時,它工作正常。當我現在將值添加到我的sql代碼時,會發生錯誤。請原諒我不太漂亮的sql查詢,這是我可以獲取我需要的數據的唯一方法。將字符串參數傳遞給mysql

錯誤消息:類型錯誤:必須是字符串或只讀緩衝器,而不是元組

import mysqldb 
import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('-m','--machine', nargs=1, help="Machine Hostname", action="store") 
args = parser.parse_args() 

query = (""" select ifname, usname, mtdesc, lobuilding Location from 
interface left join machine on ifmcid=mcid 
left join machine_type on mcmtid=mtid left join user on mcusid=usid left join location on mcloid=loid 
WHERE mccurrentosid = 32 AND ifname = %s """, (args.machine,)) 
cur.execute(query) 
for row in cur.fetchall(): 
print row 
+0

是你會得到錯誤信息? – jsbueno

+0

TypeError:必須是字符串或只讀緩衝區,而不是元組 – gratchie

+0

因此,您的答案也是如此 - 將'args.machine'參數作爲簡單參數傳遞,不需要封裝在元組中,就像字符串格式化一樣使用'%'運算符。 – jsbueno

回答

1

查詢參數傳送到​​:

query = """ 
    select 
     ifname, usname, mtdesc, lobuilding 
    from 
     interface 
     left join 
      machine 
     on 
      ifmcid=mcid 
     left join 
      machine_type 
     on 
      mcmtid=mtid 
     left join 
      user 
     on 
      mcusid=usid 
     left join 
      location 
     on 
      mcloid=loid 
    WHERE 
     mccurrentosid = 32 AND 
     ifname = %s 
""" 
cur.execute(query, (args.machine,)) 
+0

現在我收到了一個不同的錯誤:_mysql_exceptions.ProgrammingError:(1064,「你的SQL語法有錯誤;檢查與你的MySQL服務器版本相對應的手冊, 「) – gratchie

+0

@gratchie請注意,我已經把FIXME放到查詢中了 - 應該在'lobuilding'和'Location'之間有一個逗號? – alecxe

+0

我實際上可以刪除'位置'。這裏是我目前的sql:query =「」「select ifname,usname,mtdesc,從接口左邊連接機器上建立ifmcid = mcid left join machine_type on mcmtid = mtid左邊連接用戶on mcusid = usid左邊連接位置on mcloid = loid WHERE mccurrentosid = 32 AND ifname =%s「」「 cur.execute(query,(args.machine,)) for row in cur.fetchall(): print row – gratchie

0

嘗試不同的排列組合後,終於得到了一個工作代碼。我必須刪除args.machine中的','。也許「左連接」語句不再需要它。

cur.execute(query, (args.machine)) 

感謝您的幫助@alecxe