【Python】Pandasのread_sqlにパラメータを渡すには?

python Python
この記事は約4分で読めます。
スポンサーリンク

SQLのSELECT文をPandasでデータフレームに変換するメソッドでread_sqlというメソッドがあります。Pythonでデータベースからデータを取得するときに非常に便利なメソッドです。

先日、このread_sqlでWHERE句にパラメータを渡したいことがあったのですが
どう渡したらよいかわからずちょっと悩んだので、備忘録として残しておきます。

結論として、
pandas.read_sql(sql,con,params=[パラメーターの値])でSQLに対してパラメータを渡して、
SQL側は?で受け取ることができます。

どんな時に使う?

pandasのread_sqlは、データベースからSQLでデータを取得したいときに使用します。
普段からSQLを使ってデータを使用している人にとって、非常に重宝するメソッドです。

基本構文は以下の通りです。

import pandas as pd
df = pd.read_sql(sql,con)

()内のsqlは、実際に取得するためのSQLが入ります。conはODBCなどで接続するためのDB接続文字列が入ります。接続文字列と取得するSELECTなどのSQLを記載すれば簡単にデータベース内で取得したデータをデータフレームに変換してくれます。pythonでは、このデータフレームをいろいろいじくってデータの分析などをやることが多いです。

パラメーターを使うパターン

基本的に決められたSQLを実行するだけでよいのであれば、上の構文だけで何の問題もなくSQLのデータを取得することが可能です。
ただ、
SELECT * FROM テーブル名 WHERE 項目1 = ‘aaa’
だけでなく項目1が’bbb‘や’ccc‘などのように可変となり、その値をWHERE句に指定したい場合はパラメーターを使います。

パラメーターを使用するときの構文は以下の通りです。

pd.read_sql(sql,con,params=[パラメーターの値])

引数にparams=[パラメーターの値]を付与すればパラメーターをsqlに渡すことができます。

例えばパラメータにhensu1に入った変数の値を指定したい場合は以下のようになります。

pandas.read_sql(sql,con,params=[hensu1])

とすればよいです。

では次にパラメーターを受け取る側のsqlはどのように記述すればよいかというとパラメーターを使いたい個所に ?(クエスチョンマーク)を使用すればOKです。今回の例では

sql = ”’SELECT * FROM テーブル WHERE 項目1 = ? ”’

とすれば?にhensu1でセットした値を代入してくれます。私はこの?が出てこなくて悩みました。わかれば、すごくシンプルでわかりやすいです。

パラメーターを複数使うパターン

paramsに渡したいパラメータの数が複数の場合もあると思います。この場合はparamsをカンマで区切り、複数のパラメータを記述します。

pd.read_sql(sql,con,params=[パラメーター1,パラメーター2,・・・])

例えば、パラメーターが2つあって、pd.read_sql(sql,con,params=[hensu1,hensu2])とした場合、
SQL側は以下のように記述します。

sql = ”’SELECT * FROM テーブル WHERE 項目1 = ? AND 項目2 = ? ”’

この場合は、項目1の?にはhensu1にセットされた値が、項目2の?にはhensu2にセットされた値がそれぞれ順番に代入されます。もちろんパラメーターが3個以上にも対応できます。

まとめ

Pandasのread_sqlについて

  • 基本構文はpd.read_sql(sql,con)
  • パラメータありの場合は、pd.read_sql(sql,con,params=[パラメーターの値])
  • パラメーターが複数の場合は、pd.read_sql(sql,con,params=[パラメーター1,パラメーター2,・・・])
  • SQL内に渡されたパラメーターは、?(クエスチョン)で指定する。
  • pd.read_sqlのパラメーターと?の数は一致させる。

私みたいにデータベースのデータ取得はSQLで普段やっている人は、かなりヘビーに使うと思います。

コメント

タイトルとURLをコピーしました