2011-11-15 49 views
1

當我運行以下SQL語句時,出現「運算符錯誤附近」?「」錯誤;Python中的SQLite3更新錯誤

key = 'field_a' 
    value = '01/01/2011' 
    #self.testac = '010101010' 

    self.qry.execute('''UPDATE data_base SET ?=? WHERE atnumber = ?''',(key, value, self.testac)) 
    self.qry.commit() 

鍵和值是根據用戶想要編輯的字段動態生成的,這就是爲什麼SET語句有?=?

任何想法?

謝謝!

回答

4

根據猜測,?語法僅用於參數綁定。也就是說,插入的值的綁定參數轉換適當的格式化和轉義的字符串。這不是一個通用的字符串替換工具 - 只需使用列名稱的常規字符串替換。

例如,你會使用:

key = 'field_a' 
value = '01/01/2011' 
#self.testac = '010101010' 

sql = '''UPDATE data_base SET %(key)s=? WHERE atnumber = ?''' % dict(key=key) 
self.qry.execute(sql, (value, self.testac)) 
+0

可以混合使用 '?'和字符串替換?例如:('''UPDATE data_base SET%s =?WHERE atnumber =?''',(key,value,self.testac)或者在這種情況下,對所有變量使用字符串格式是更好的做法?謝謝! –

+1

Python使用printf風格的語法(使用'%'運算符)或Windows風格的可擴展語法(使用'format()'方法)進行字符串格式化 - 既不使用'?'作爲特殊(他們可能會或可能不會與SQLite查詢語法衝突,但在您的示例中沒有) – millimoose

+1

@LanceCollins我用一個我想到的例子更新了答案,我使用printf樣式格式,因爲我是更多習慣它,但建議在新代碼中使用新式格式。 – millimoose

2

?語法僅用於綁定值,以防止注入攻擊(example)。

如果您要輸入=左側的用戶輸入信息,則必須確保將其自我消毒。要動態生成語句,任何python字符串方法都可以, ,但你真的不應該這樣做。

一個更好的方式是有對的字典{key:sql_str}

call_dict = {'col_name':'UPDATE data_base SET col_name=? WHERE atnumber=?'} 
self.qry.execute(call_dict[key],(value,self.testac)) 

[編輯,固定錯字]