2017-03-01 108 views
3

試圖組建跨多行更長的SQL字符串在Python 2.7使用參數,類似於:裝配長字符串參數蟒蛇

duration_sql = "select MessageTime, " + \ 
"Value from [%s] " + \ 
"where Subsystem=%s and " + \ 
"Field=%s " + \ 
"and MessageTime > %s and " + \ 
"MessageTime < %s" % (i, j, k, l, m) 

但我得到一個運行時錯誤:

TypeError: not all arguments converted during string formatting 

如果我允許它是一個沒有換行符的長字符串,它可以正常工作。任何方式我可以打破一個長字符串與參數?想不通的祕密武器......

+5

注意,它通常是一個壞主意,使用Python的原生字符串格式化,以便插入參數到您的SQL查詢。這可能會讓你容易受到SQL注入攻擊。只要有可能,請使用您正在使用的任何庫提供的參數化工具來與數據庫交談。 – Kevin

+0

非常好的主意,凱文。我有它在我的意見,注意這一點,我認爲我應該按照我自己的建議...我很希望創建的字符串,然後進入了pymssql的execute()函數並添加參數存在。 – Omortis

回答

7

試試這個:

duration_sql = ("select MessageTime, " 
    "Value from [%s] " 
    "where Subsystem=%s and " 
    "Field=%s " 
    "and MessageTime > %s and " 
    "MessageTime < %s") % (i, j, k, l, m) 

帶括號的周圍,你不需要+\來組合字符串:所有相鄰的字符串文字被組合成一個字符串文字。

(另請參閱凱文的關於不使用字符串格式化到變量插入到數據庫查詢評語)

5

這是因爲%只適用於最後一個字符串:

"MessageTime < %s" % (i, j, k, l, m) 

圓括號你的字符串,你會被罰款

duration_sql = ("select MessageTime, " + \ 
"Value from [%s] " + \ 
"where Subsystem=%s and " + \ 
"Field=%s " + \ 
"and MessageTime > %s and " + \ 
"MessageTime < %s") % (i, j, k, l, m) 
0

最簡單的方法可能是改變「爲‘’」

duration_sql = """select MessageTime, 
Value from [%s] 
where Subsystem=%s and 
Field=%s 
and MessageTime > %s and 
MessageTime < %s""" % (i, j, k, l, m) 

與其他回答說,你可能希望避免字符串格式化的SQL查詢時,它可以暴露你的SQL注入

+0

不知道我想它混淆與徵求意見的文檔信息的風格.... – Omortis

+0

@Omortis好,對我來說這是做最徹底的方法。你不必+ \在最後,它還是一個字符串,沒有字符串組合。 –

+0

這是一個很好的藉口,學習pymssql的參數插入式的,所以我也同意了。 – Omortis