4、 Pythonを使ったMySQLへのアクセスとクエリ設定
PHPだけでなくPythonからMySQLにアクセスしてクエリデータが取り込めれば、データ加工がやりやすい。そこでMySQL-Pythonの学習をした。
Python3でMySQLに接続するドライバーにはPython2系から使われている「mysqlclient」と、Oracleが提供する「mysql-connetor-python」がある。ネット記事では後者を使った例が多いので、インストールして使用したところ、
「segamentation fault(コアダンプ)」
というエラーが出て動作しない。ネット記事を見るとubuntu18.04のPython3との相性が悪くバグがあるようだ。
そこで「mysqlclient Python3でMySQLに接続する」という記事を参考に、MySQLクエリの実行プログラムを作成した。
・libraryのInstall方法 //https://github.com/PyMySQL/mysqlclient
Linux
You may need to install the Python 3 and MySQL development headers and libraries like so:
はじめに下記のモジュールを入れておく。
$ sudo apt-get install python3-dev default-libmysqlclient-dev build-essential # Debian / Ubuntu
Then you can install mysqlclient via pip now:
その後、mysqlclientをインストールする。
$ pip install mysqlclient
・接続 & select実行プログラム
前回のPHPと同様、データベースclimateのテーブルiida_agri_sensorから気象データを抽出する。
#mysqlclientライブラリのインポート import MySQLdb # データベースへの接続とカーソルの生成 connection = MySQLdb.connect( host='localhost', port=3306, user='miyasan', passwd='*******', db='climate', ) cursor = connection.cursor() yymm = ['2020-10-04', '2020-10-05'] date1=yymm[0] date2=yymm[1] cursor.execute("""SELECT * FROM iida_agri_sensor WHERE date BETWEEN %s AND %s LIMIT 10""",(date1,date2)) results = cursor.fetchall()
たったこれだけでMySQLのデータを抽出できる。PHPに比べて簡単でわかりやすい感じ。
cursorで読み込まれたresultsのデータは配列に格納されている。(ipython3での確認結果)
In [40]: results[0] Out[40]: (datetime.datetime(2020, 10, 4, 0, 0, 17), 18.1, 89.3, 961.5, 18.81, 20.56, 657.0, 496.0, 0.0)
コンソールにデータを表示する場合:
for row in cursor: print(row) 表示結果: (datetime.datetime(2020, 10, 4, 0, 0, 17), 18.1, 89.3, 961.5, 18.81, 20.56, 657.0, 496.0, 0.0) (datetime.datetime(2020, 10, 4, 0, 1, 21), 18.1, 88.7, 961.4, 18.81, 20.56, 657.0, 495.0, 0.0) (datetime.datetime(2020, 10, 4, 0, 2, 25), 18.1, 89.2, 961.5, 18.81, 20.62, 658.0, 489.0, 0.0) ..........
ファイルに保存する場合:
with open('print.csv', 'w') as f: for row in cursor: print(*row, sep=',', file=f) # 接続を閉じる connection.close()
・コマンドラインからの引数の受取
プログラムにsysライブラリを入れて、引数をつけて以下のようにコマンド入力すればOK
python3 python-sql-argu.py 2020-10-04 2020-10-5
#python-sql-argu.py import sys import MySQLdb # データベースへの接続とカーソルの生成 connection = MySQLdb.connect( host='localhost', port=3306, user='miyasan', passwd='*********', db='climate', ) cursor = connection.cursor() # コマンドライン引数の受取 args = sys.argv date1=args[1] #startdate argument date2=args[2] #enddate argument cursor.execute("""SELECT * FROM iida_agri_sensor WHERE date BETWEEN %s AND %s LIMIT 10""",(date1,date2)) results = cursor.fetchall() # SQL内でパラメータにしたい箇所は%sにし、第2引数にパラメータをタプルで指定する。 with open('print.csv', 'w') as f: for row in cursor: print(*row, sep=',', file=f) # 接続を閉じる connection.close()
今回の学習はPHPが主体なので、PythonとMySQLの接続の基本のみ触れてみたが、PHPに比べてわかりやすい印象を受けた。
PHP・MySQL・canvasJSを使った動的なチャート生成 関連記事
4、 Pythonを使ったMySQLへのアクセスとクエリ設定
コメント