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で普段やっている人は、かなりヘビーに使うと思います。
コメント