リモートのMySQLからデータをpandasに取ってくる

リモートサーバ上のMySQLからデータを引っ張ってきて、pandasで処理したかったのです。環境は以下です。

rdbからデータ取得するための関数が、pandasには用意されています。「pandas.read_sql_query」は、実行したSQL結果をデータフレームにしてくれます。「pandas.read_sql_table」は、指定したテーブル内のデータをデータフレームにしてくれます。今回はクエリーを実行したいので、「pandas.read_sql_query」を利用します。

公式ドキュメントはこちら。

pandas.read_sql_query — pandas 0.19.2 documentation

使い方はこちら。

pandas.read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, chunksize=None)

基本的にsqlとconのパラメータを与えます。その他パラメータは必要に応じて確認。sqlはその名の通り実行するクエリーを与えてあげればよく、conは接続先のdb情報を教えてあげます。接続情報はSQLAlchemyを利用したコネクションで与えることになります。

SQLAlchemyとは、僕も今回知りましたが、「SQL Toolkit and Object Relational Mapper」と説明されるもので、データベースとオブジェクト指向言語の間を繋いでくれるやつですね。

使い方は以下の通り。これでpythonrdb間のコネクションを貼ってくれます。事前にpipでSQLAlchemyをインストールしておきます。

from sqlalchemy import create_engine

engine = create_engine('dialect+driver://username:password@host:port/database')

公式で、各RDB毎のサンプルを記載してくれています。

Engine Configuration — SQLAlchemy 1.1 Documentation

MySQLでの詳細サンプルはこちら。丁寧なサイトですね。

MySQL — SQLAlchemy 1.1 Documentation

尚、通常のPython環境ではMySQLのドライバなんてインストールされていないので、事前にドライバを入れておく必要あります。入っていない場合、以下のように怒られます。

ImportError: No module named 'MySQLdb

今回はなるべく軽めのものということで、「PyMySQL」というやつを利用することとしました。

公式。「a pure-Python MySQL client library」と説明されてます。pipで「PyMySQL」をインストールしておきましょう。

GitHub - PyMySQL/PyMySQL: Pure Python MySQL Client

ということで以上の事前準備を踏まえ、今回の目的であった「pandas.read_sql_query」を書くと以下みたくなります。

import pandas
from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://root:password@192.168.1.24:3306/kessan')
sql = "select code, stock_price, Date_Day from kessan.stock_price where Date_Day between '2016-08-01' and '2016-12-30'"

df = pandas.read_sql_query(sql, engine)

これでクエリー結果がdfというデータフレームになってくれてます。