ホームページ > バックエンド開発 > Python チュートリアル > SQLite でシーケンスと文字列を使用する場合のパラメーター置換の問題を解決するにはどうすればよいですか?

SQLite でシーケンスと文字列を使用する場合のパラメーター置換の問題を解決するにはどうすればよいですか?

DDD
リリース: 2024-10-19 15:28:30
オリジナル
567 人が閲覧しました

How to Resolve Parameter Substitution Issues in SQLite When Using Sequences vs. Strings?

SQLite でのパラメータ置換の問題のトラブルシューティング

Python を使用して SQLite3 でパラメータ置換を利用するときに問題が発生しましたか?ここでは詳細な調査と解決策を示します。

SQL インジェクションを防止するために、「?」を使用したパラメータ置換が行われます。がおすすめです。ただし、このアプローチを使用するとエラーが発生する可能性があります。たとえば、次のコードの場合:

<code class="python">for item in self.inventory_names:
    self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
    self.cursor.close()</code>
ログイン後にコピー

エラー「sqlite3.ProgrammingError: Incorrect number of bindings provided」が発生します。これは、ステートメントで 1 つのバインディングが指定されているのに、8 つのバインディングが指定されていることを示します。この問題は、データベース テーブルの最初の作成に起因します。データベースの作成を担当するモジュールには 8 つのバインディングが含まれているため、不一致が生じます。

<code class="python">cursor.execute("""CREATE TABLE Equipment 
    (id INTEGER PRIMARY KEY, 
    name TEXT,
    price INTEGER, 
    weight REAL, 
    info TEXT, 
    ammo_cap INTEGER, 
    availability_west TEXT,
    availability_east TEXT)""")</code>
ログイン後にコピー

皮肉なことに、'?' を置き換えます。安全性の低い '%s' を使用すると、問題が解決されます:

<code class="python">for item in self.inventory_names:
    self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item)
    self.cursor.close()</code>
ログイン後にコピー

この矛盾の背後にある理由は、Cursor.execute() が 2 番目のパラメータを受け入れる方法にあります。単一の文字列ではなくシーケンスが必要ですが、長さ 8 の文字列を渡しています。

この問題を修正するには、コードを次のように調整します。

<code class="python">self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])</code>
ログイン後にコピー

この変更パラメーターの置換が意図したとおりに機能することを保証します。 Cursor.execute() に渡される 2 番目のパラメーターが SQL ステートメント内の指定されたバインディング数に対応していることを常に確認してください。

以上がSQLite でシーケンスと文字列を使用する場合のパラメーター置換の問題を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート