2011-09-11 6 views
8

私は、Python 2.6を経由してのSQLiteデータベースのuser_versionを変更しようとしている、と私は次の操作を実行しようとしました:PRAGMAでsqlite3パラメータ置換を使用できませんか?

cur.execute("PRAGMA user_version = ?" , (version,)) 

それは次のエラーで失敗します。

cur.execute("PRAGMA user_version = ?" , (version,)) 
sqlite3.OperationalError: near "?": syntax error 

私は疑問符の代わりに名前付きのスタイルを試しましたが、同じエラーで失敗します。

SQL文字列の一部として数値をドロップするか、Pythonの文字列演算を使用しても、すべて正常に動作しますが、どちらかを実行しないでください。

なぜこれが機能しないのですか?
そして、この呼び出しに変数から数値を安全に挿入するにはどうすればよいですか?

答えて

4

特定の値のみをパラメータ化できます。表と列の名前でもパラメータ化できません。あなたの実験では、プラグマ値もパラメータ化できないことが示されています。

user_versionexpected to be an integerです。 あなたがversionが整数でない場合ValueErrorを送出します

cur.execute("PRAGMA user_version = {v:d}".format(v=version)) 

形式{v:d}と同時に文字列フォーマットを使用して、自分自身を守ることができます。

+0

私はそう思っていました。では、どうすれば値を安全に挿入できますか?唯一の内部的な使用法が単純な文字列の連結またはPythonの許容範囲内であればここで受け入れられますか? – DMA57361

+1

これは、パラメータが整数の場合に制限を処理する良い方法です。他のプラグマのパラメータが代わりに文字列だった場合、フォーマットを確認する必要はありません(たとえば7のような整数は "7"として有効です)が、SQL注入を避けるためにパラメータをエスケープする必要があります。それを行う便利な方法はありますか? – spaaarky21

+0

@ spaaarky21:私はsqlite3がマニュアルクォートを提供するために提供されている機能を認識していません。文字列を受け入れる他のプラグマについては、許容される入力のホワイトリストを列挙し、この入力に対してユーザー入力をチェックするのが最も安全な方法でしょう。 – unutbu

関連する問題