2009-06-17 6 views
10

を引用:SQLiteのパラメータ置換と私はOKに動作し、このライン持って

c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name) 

をしかし、私は(私はこれがより安全であることをhereを見るので)SQLiteのパラメータ置換の代わりの代わりに文字列置換を使用します。

これは私の(失敗)してみてくださいです:

t = (name,) 
c.execute('select cleanseq from cleanseqs WHERE newID="?"',t) 

しかし、この行が返されます:供給バインディングの

」誤った番号を 。現在のステートメントは 0を使用しており、1つが供給されています。

したがって、私の声明の左の部分は機能しません。私は1つのバインディング(名前、t)を提供していますが、疑問符(?)は解析されていないようです。 ?引用符を削除すると、?が動作します。しかし、私は彼らが必要な場合があることを覚えているので、私は引用符がそこに残ることを望む。

そこで質問です:

c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name) 
+0

パラメータを使うことは素晴らしいことです。より安全なだけでなく、はるかに高速です。ここで読む:http://stackoverflow.com/questions/904796/how-do-i-get-around-the-problem-in-sqlite-and-c/926251#926251 – tuinstoel

答えて

9

を、それが動作しますが、私はそれらを必要とする場合があることを覚えているので、引用符がままにしておきたいです。 "" "

自分でSQL文全体を作成していたときに覚えていることは無関係です。

新しい話は次のとおりです。 SQLステートメントの各場所で値を置換したい場所を1つの値を含むタプルで渡します。それは簡単です。ラッパーは文字列を引用して、受け入れ可能なSQL定数であることを確認します。

4

が前後に引用符を失う:私はこの行を変換する方法を教えてください。

c.execute('select cleanseq from cleanseqs WHERE newID=?',(t,)) 

これは文字列 "?"として処理しています。

シングルの代わりに式全体を二重引用符で囲む必要がありますか?

2

ライブラリでは、引用とエスケープが処理されます。単純にこのようなあなたのクエリ書く:?私はsourronding引用符を削除した場合、「「」について

c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=?', (name,)) 
13

私ははるかに読みやすいという名前のパラメータバインディングのスタイルを見つける - とsqlite3がそれをサポートしています。

c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=:t', locals()) 

注:代わりにlocals(){'t': t}またはdict(t=t)を渡すと、よりpunctiliously正しいだろうが、私の意見では、それは希望複数のパラメータや長い名前がある場合は、読みやすさを妨げます。いずれにしても、:t? ;-)より優れています。

+0

+1また、複数の変数を同じクエリで複数回再利用することなく、変数を複数回再利用することも容易になります。 – Martijn

18

私の好きな人には、このスレッドを見つけて、時には引用符を無視できないということを無視している人には本当に不満を感じています(LIKEコマンドを使用しているので)次のような効果があります。

var = name + "%" 
c.execute('SELECT foo FROM bar WHERE name LIKE ?',(var,)) 

これにより、この状況ではワイルドカードで置き換えることができます。

0

はちょうどあなたが「「フィールド名= \ ..他のSQL surgerここでは」= +値をsql_stringの安全でない方法を使用して、このマニュアルを行う必要があるでしょうことに気づいた正規ユーザー+」\「;」

これを唯一の方法で正しく解析することができます。 勝利のためにSQLiteを使用する。他の選択肢がないまま残しておけば、値をエスケープしてからSQLインジェクションから非常に悲しいデータベースになるでしょう: '(lol