2017-10-09 6 views
1

こんにちは私はf_nameから値を選択し、WHERE句で%sを置き換えるために、クエリを期待トリプルクォート エスケープ%のEは

f_name = "'Pra_%'" 
df = cp.sql("""SELECT first_name, last_name, FROM Students 
       WHERE first_name LIKE %s 
       AND last_name LIKE '%Elephant%' 
      """ % (f_name)) 

でクエリを持っています。

は、次のエラーを受け取りました:

TypeErrorTraceback (most recent call last) 
<ipython-input-22-6544d0eca4d1> in <module>() 
    3 WHERE first_name LIKE %s 
    4 AND last_name LIKE '%Elephant%' 
    ---> 5 """ % (f_name)) 

TypeError: not enough arguments for format string 

私はそれがフロートとして%Elephant%%Eを治療し、引数を期待していると思います。 WHERE句に第2条件(AND last_name LIKE '%Elephant%')がない場合に機能します。

この場合、どのようにエスケープして動作させることができますか? %をエスケープする

答えて

3

、あなたは%%

+0

これは機能しました!ありがとう。 @AlanCPSC –

+1

この解決策は正しく動作しますが、** unutbu **によって以下に提案されているものは実装する方が安全です。 – RoyaumeIX

4

文字列フォーマットを回避することにより、SQL injectionから身を守るにそれを二重にする必要があります。どこでも 使用パラメータ化SQL:あなたが引用'Pra_%'を倍増する必要はありません

import pandas.io.sql as psql 
sql = """SELECT first_name, last_name, FROM Students 
       WHERE first_name LIKE %s 
       AND last_name LIKE %s""" 
args = ('Pra_%', '%Elephant%') 
df = psql.read_sql(sql, conn, params=args) 

注意してください。データベースアダプタはあなたのために引数を引用します。したがって、parametrized sqlを使用すると、より安全なだけでなく、簡単です。

関連する問題