3

同様のスレッドをいくつか見たことがありますが、文字をエスケープしようとしてもうまくいきません。

つまり、文字列のリストがあり、それを繰り返し処理しているため、リストに含まれる文字列を「Select, Like」クエリに組み込むクエリを作成することを目指しています。

これが私のコードです(Python)

def myfunc(self, cursor, var_list):
   query = "Select var FROM tble_tble WHERE"
   substring = []
   length = len(var_list)
   iter = length

   for var in var_list:
      if (iter != length):
         substring.append(" OR tble_tble.var LIKE %'%s'%" % var)
      else:
         substring.append(" tble_tble.var LIKE %'%s'%" % var)
      iter = iter - 1

   for str in substring:
      query = query + str
...

それで十分なはずです。以前に述べた主張から明らかでない場合、関連する文字列のリストに対して SQL の「LIKE」比較を実行するクエリを作成しようとしています。

お時間をいただきありがとうございます。ご不明な点がございましたら、お気軽にお問い合わせください。

4

3 に答える 3

11

まず、あなたの問題は SQL とは何の関係もありません。SQL 関連のコードをすべて破棄して、次のようにします。

var = 'foo'
" OR tble_tble.var LIKE %'%s'%" % var

同じエラーが発生します。%これは、迷子の記号が含まれる文字列で -formatting を実行しようとしているからです%。それで、それは何をすべきかを理解しようとしていますが%'、失敗しています。


次のようにして、これらの迷いの%兆候を逃れることができます。

" OR tble_tble.var LIKE %%'%s'%%" % var

ただし、それはおそらくあなたがやりたいことではありません。


最初に、{}-formatting の代わりに%-formattingを使用することを検討してください。特に、全体に文字を含む書式設定された文字列を作成しようとしている場合はそうです%。それらをエスケープする必要がなくなります。そう:

" OR tble_tble.var LIKE %'{}'%".format(var)

しかし、もっと重要なことは、このフォーマットをまったく行うべきではないということです。値を SQL 文字列にフォーマットしないでください。単に SQL パラメーターとして渡します。sqlite3 を使用している場合は、?パラメーター マーカーを使用します。MySQL の場合、%s; 別のデータベースについては、そのドキュメントをお読みください。そう:

" OR tble_tble.var LIKE %'?'%"

ここで問題が発生する可能性はありません。また、エスケープする必要があるものもありません。executeクエリ文字列で呼び出す場合は[var]、引数として渡します。

これははるかに単純で、多くの場合高速であり、エッジ ケースを処理する多くのばかげたバグをきちんと回避します。そして何よりも重要なのは、SQL インジェクション攻撃から保護することです。

sqlite3のドキュメントでは、これについて詳しく説明しています。

通常、SQL 操作では Python 変数の値を使用する必要があります。Python の文字列操作を使用してクエリを組み立てるべきではありません。代わりに、DB-API のパラメーター置換を使用してください。値を使用する場所にプレースホルダーとして配置し、カーソルのメソッド?の 2 番目の引数として値のタプルを指定します。execute()(他のデータベース モジュールは、%s や :1 などの別のプレースホルダーを使用する場合があります。) …</p>


最後に、他の人がコメントで指摘したように、LIKE条件付きで、パーセント記号を引用符の外側ではなく引用符の内側に配置する必要があります。したがって、これをどのように解決しても、別の問題を解決する必要があります。しかし、その方がはるかに簡単なはずです。(そうでない場合は、いつでも戻って別の質問をすることができます。)

于 2013-08-01T19:18:53.663 に答える