質問

うことにより組み立ては以下のSQL文を使用pythonのdb-api:

SELECT x FROM myTable WHERE x LIKE 'BEGINNING_OF_STRING%';

がBEGINNING_OF_STRINGはpython varする安全に充填し、DB-APIとなります。てみました

beginningOfString = 'abc'

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%', beginningOfString) 
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%%', beginningOfString)

私のアイデア何が正しい方法です。

役に立ちましたか?

解決

これは、可能な場合は、SQLからパラメータを分離するのが最善です。 そして、あなたはパラメータを引用正しいのDBモジュールの世話をさせることができます。

sql='SELECT x FROM myTable WHERE x LIKE %s'
args=[beginningOfString+'%']
cursor.execute(sql,args)

他のヒント

編集:

としてのブライアン-トーマスとは、 と良いことを利用する:

beginningOfString += '%'
cursor.execute("SELECT x FROM myTable WHERE x LIKE ?", (beginningOfString,) )

最初の方法の葉を開けるSQLインジェクション攻撃であった。


左のための歴史

う:

cursor.execute("SELECT x FROM myTable WHERE x LIKE '%s%%'" % beginningOfString)

sqlite3ののドキュメントを書き留めます:

  

通常、SQL操作が必要になります   Pythonの変数から値を使用します。   あなたのクエリを組み立てるべきではありません   Pythonの文字列操作を使用して   そうすることが安全ではないので。させる   あなたのプログラムSQLに対して脆弱   インジェクション攻撃ます。

     

その代わり、DB-APIのパラメータを使用します   置換。置きますか?プレースホルダとして   どこに値を使用したい、と   次いでなどの値のタプルを提供   カーソルの2番目の引数   ()メソッドを実行します。 (他のデータベース   モジュールが異なるを使用することができます   例えば%S又はプレースホルダ:1)について   例:

# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)

# Do this instead
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)

# Larger example
for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]:
    c.execute('insert into stocks values (?,?,?,?,?)', t)

私はあなたがこれをしたいと考えます:

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,) )
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top