Jupyter Notebook上(Python)からDBのデータを可変的にデータを取得する
DBから複数条件を変更しながらデータを取得したい
- テラバイトを超えるようなビッグデータを時系列(月次、日次)で分割してダウンロードしたい
- マスターデータに合致する対象の顧客データだけを抽出したい
- 条件が異なるデータ抽出を自動で(一括して)実行したい
Pythonでデータベースにアクセスしデータを抽出するライブラリにはpsycopg2、pydb、presto-python-clientなどがあります。
【参考】
https://qiita.com/ko-da-k/items/aa26f986a09b3b629e2a
https://qiita.com/yolo_kiyoshi/items/0c3c7f7cc5794d1afaec
どのライブラリも「数字」や「文字列」といった変数を指定することができますがWHERE order_code LIKE IN ('aaa%', 'bbb%', 'ccc%')
のように「タプル()」を上手く渡せますでしょうか。
また、変数の指定方法もライブラリごとに異なり、%s
や'{variable}'
のようにクエリ内での表記方法は様々です。
f-stringを利用する
使用するライブラリの違いによる制限をなるべく受けることなく上記の問題に対応するにはf-stringを用いた実装が有効です。
import psycopg2
import pandas as pd
def get_query(HOGEHOGE:str, AMPM:str, TIME:str) -> str:
# 変数は{}で指定
query = f"""
select *
from DATABASE
where order_code like in {HOGEHOGE}
and business_day = {AMPM}
and TIME = {TIME}
"""
return query
# 変数の指定
HOGEHOGE = ('aaa%', 'bbb%', 'ccc%')
# 期間の指定
TERM = [['AM', 1],
['AM', 2],
['PM', 1],
['PM', 2]]
# データ取得
# connectionについては【参考】等、他記事を参照
for t in TERM:
data = pd.read_sql(get_query(HOGEHOGE, t[0], t[1]), con = connection)
data.to_csv(f'{hogefuga}_{t[0]}_{t[1]}.csv')
以上のように、f-stringを用いてクエリそのものを書き換えてから引数に与えればタプルでも文字列でも渡すことができます。
データ基盤を自由に使えず、複数の更新されるデータを取得する必要がある際にはとても強力でしょう。
実行結果
上記コードで実際に引数として渡しているクエリは下記の通りです。
select *
from DATABASE
where order_code like in ('aaa%', 'bbb%', 'ccc%')
and business_day = AM
and TIME = 1
select *
from DATABASE
where order_code like in ('aaa%', 'bbb%', 'ccc%')
and business_day = AM
and TIME = 2
select *
from DATABASE
where order_code like in ('aaa%', 'bbb%', 'ccc%')
and business_day = PM
and TIME = 1
select *
from DATABASE
where order_code like in ('aaa%', 'bbb%', 'ccc%')
and business_day = PM
and TIME = 2