2011-11-15 11 views
1

次のSQL文を実行するとエラーが発生しますか?PythonでSQLite3 UPDATEエラーが発生しました

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)) 

[編集、固定タイプミス]

関連する問題