2017-05-04 4 views
2

mysqlコネクタとpythonのようにクエリを書く方法は?私はSQLインジェクションを避けようとしており、ORMの使用はオプションではありません。pythonとmysqlコネクタのようなものを使ってクエリを書く

 param = 'bob' 
     select_query = mysql_conn.query_db("select * from table_one where col_name like '%?%' order by id asc limit 5", param) 

クエリが実行されても、同じ結果が得られます。私は何も得られないはずです。

以下のクエリを使用すると、エラーが発生します。

 select_query = mysql_conn.query_db("select * from table_one where col_name like %s order by id asc limit 5", param) 

SQL構文に誤りがあります。 に渡されたクエリ文字列内の任意のリテラルパーセント記号を実行することをライン1

答えて

2

あなたね、エスケープする必要があります名前付きパラメータを使用した場合のパラメータは、上記のようなタプルとして、または辞書として渡す必要があります。また

select_query = mysql_conn.query_db(
    "select * from table_one where col_name like %s order by id asc limit 5", 
    ("%{}%".format(param),) 
) 

paramあなたはこのように例えば、脱出する前に渡しているに %ワイルドカードを追加するためのエド
select_query = mysql_conn.query_db(
    "select * from table_one where col_name like %(p)s order by id asc limit 5", 
    {"p": "%{}%".format(param)} 
) 
+0

これはうまくいきました。ありがとう。私は別の質問があります。 paramをタプルとして設定し、クエリとタプルを接続クラスに送ります。しかしそれは失敗する?接続クラスのタプルとしてparamを設定する必要があります。 get_connectioned私の接続クラスの – user3525290

+0

のparam =(のRequest.Form [ 'TXT']、) <クラスのタプル '> クラス(): デフquery_db(自己、クエリ、PARAM): self.curr.execute(クエリ、(パラメータ) 戻りself.curr は、上記に障害が発生した。しかし、私は次の操作を行う場合、それは動作します のparam =のRequest.Form [ 'TXT'] get_connectionedクラス():。。 デフquery_db(自己、クエリ、param): self.curr.execute( "%{}%"形式(param))) return self.curr なぜクラス作業でタプルを作るのですか? 〜でタプルは失敗しますか? – user3525290

+0

@ user3525290このようなコードでコメントするのは難しいです。最初のものがそのままパラメータを使用し、2番目のパラメータがワイルドカードで囲まれている点を除いて、ほぼ同じことが行われます。 – mata

1

ノートで「IDの昇順制限5によって%sのため」近くを使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認してください()すなわち%%

http://mysql-python.sourceforge.net/MySQLdb.html

ほとんどの書式古いスタイルのPythonの文字列と同じものである、Cのprintfなどなど

関連する問題