2012-11-20 53 views
0

我有一個小問題。我認爲我是f =做一些愚蠢的事情,但無法弄清楚mysqldb.exeute中的字符串替換問題

第一: 我想從python的mysql上激發一個動態構建的sql。它的簡單插入語句,但值中可以有雙引號和其他特殊字符。所以,我不知道該怎麼做。 後來我才翻過這個線程 - Stackoverflow

根據這一點,我嘗試下面的代碼

def fire_statement(stmt, value_tuple=None): 

    try: 
     if value_tuple == None: 
      cur.execute(stmt) 
      return True 
     else: 
      v = tuple(value_tuple)     
      cur.execute(stmt % v) 
      return True 
    except Exception, ex: 
     print ex 
     print "Query: '"+stmt+"'" 
     return False 

我必須通過這個函數的動態創建語句和value_tuple我沒有其他辦法作爲列名並且這兩個值都將取決於外部條件。 qand另一條信息是傳遞的value_tuple最初是一個列表。

兩個條件都發生在該代碼,唉沒有一個的方法工作

條件1:當value_tuple =( '269', '1', '69', '1096', '1' , '3070801', '是', '1963', '6') 和語句= INSERT INTO XXX(NCLASSCRECEIVESUBCATGDATEASSCODEPATENTCOUNTRYGYEARCAT)VALUES(?,?,? ,?,?,?,?,?,?) 我收到此錯誤 - 並非在字符串格式化過程中轉換的所有參數

(顯然這條命令將curcurcute(stmt%v)更改爲cur.execute(stmt,v))。條件-2:當value_tuple =('269','1','69','1096','1','3070801','BE','1963','6')和stmt = INSERT INTO XXX(NCLASSCRECEIVESUBCATGDATEASSCODEPATENTCOUNTRYGYEARCAT)VALUES(%S%S%S%S%S%S%S,%S,% S) 它拋出這個錯誤 - (1054, 「未知列 '是' 在 '字段列表'」) 查詢:「INSERT INTO XXX(NCLASSCRECEIVESUBCATGDATEASSCODEPATENTCOUNTRYGYEARCAT)VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s)'

它似乎根本沒有被替換。但是,如果我做一個打印(語句%V)剛好在cur.execute然後將結果顯示爲 - INSERT INTO XXX(NCLASSCRECEIVESUBCATGDATEASSCODEPATENTCOUNTRYGYEARCAT)VALUES(269,1 ,69,1096,1,3070801,BE,1963,6)

這又顯然是不正確的,因爲它沒有在引號中包含字符串值。我相信這可能會導致錯誤。爲此,我現在幾個小時在開發週期中被嚴重阻止。請幫助

在此先感謝

回答

2

你想使用

cur.execute(stmt, v) 

,而不是

cur.execute(stmt % v) 

來傳遞參數如果你有

"INSERT INTO tab (col1, col2) VALUES (%s, %s)" 

,你傳遞了兩個字符串('val1', 'val2')使用%,它將成爲:

"INSERT INTO tab (col1, col2) VALUES (val1, val2)" 

這被解釋爲列名,這顯然是不存在的。

如果你

cur.execute(stmt, v) 

它將正確的

"INSERT INTO tab (col1, col2) VALUES ('val1', 'val2')" 

解釋您也可以使用

print cur.mogrify(stmt, v) 

看到格式正確的查詢,因爲它可以在被執行你的數據庫。

+0

謝謝你救了我的命:) – SRC