pandasで色々できるようになってきたのでデータは直接DBからロードしたほうが楽な場面が増えてきた。
import mysql.connector
conn = mysql.connector.connect(
user='root',password='mysql',host='localhost',database='test',charset='utf8')
自宅のmacだと文字コードの指定がなくともOKだったが、職場の環境では指定しないとエラーとなった。いずれにしてもアクセス先のDB環境に合わせ常に指定するほうがいいのだろうと思う。
cur = conn.cursor()
query = 'select * from t_test where age > %s;'
cur.execute(query,[30])
cur.fetchall()
#> [( 1, 'foo', 34, '0120-222-456'), ( 3, 'zoo', 44, '0120-444-000')]
本来の目的であるpandasでは、csvなんかど同様read_sql()で直接読み込める。プリペアステートメントの書式が少しだけ違う。
Pandas read_sql with parameters によればread_sql()のパラメータの書式自体にもリスト・タプル・ディクショナリが指定できるようでどれを使うかはそのときの状況次第なのかな?辞書にするのが個人的には分かりやすいように感じた。
query = 'select * from t_test where age > %(age)s;'
df = pd.read_sql(query,conn,params={'age':21},index_col='id')
DataFrame化してからごにょごにょするか、DB内である程度やれることはやっておくのか?後は、そのとき次第。
cur.close()
conn.close()