Pythonでmosquittoのブローカからデータを受ける(3)受け取ったデータをMysqlのPython Connectorでデータベースに渡す
PythonでMysqlのデータベースにアクセスするために、次の参考資料を利用します。
●Mysqlの公式サイトから
Mysql Connector/Python開発者ガイドは次のページにあり、Webブラウザで内容が確認できます。またブラウザの翻訳機能を利用することもできますが、あまりわかりやすい日本語ではありませんでした。
同じ内容ですが、次のアドレスではpdfファイルで表示され全体を印刷できます。97頁と少し多いですが手許においで参照する場合便利です。
https://downloads.mysql.com/docs/connector-python-en.a4.pdf
●pipを使用してインストール
paho-mqtt は、connectors-Pythonのダウンロードサイトからダウンロードしてインストールすることもできます。しかし、Pythonのライブラリをインストールする場合はpipを利用するほうが余計なことを考えずに済み便利です。このシリーズの1回目で、次のページのpaho-mqttのインストールを行った方法で行います。
Pythonでmosquittoのブローカからデータを受ける(1)
Pythonのシステムのインストール
pipは、Python3.4以降では標準で付属しています。今回はPython3.8.3をインストールしたので、そのままの状態で利用できます。また、インストール時にAdd Python3.8 to Pathをチェックしておくと、カレント・ディレクトリがどこなのか意識することなくPythonもpipも起動できます。
pip.exeやpython3.8.exe はユーザのフォルダのAppData\Local\Programs\Python\Python38\Scriptsに格納され、pathも追加されています。
●Windowsのコマンド入力画面
Windowsのコマンドの入力画面で、まずpipでインストールされているモジュールを確認します。pipのコマンドのfreeze(もしくはlist)で、インストールされているモジュールを確認できます。次の命令で、
C:\Users\alps_>pip freeze
インストール時に用意されたモジュールの後追加されたものはないので、次に示すように、何も表示されません。
PythonでMysqlデータベースにアクセスするためのライブラリmysql-connector-pythonを、pipコマンドでインストールします。
C:\Users\alps_>pip install mysql-connector-python
インストール後、pip freezeでインストール状態を確認します。
●PythonでMysqlデータベースに接続する
PythonでMysqlデータを利用するために、pipでインストールしたモジュールmysql.connectorを利用できるようにします。使い始める最初に、import モジュール名を次のように記述します。
import mysql.connector
以後、インストールしたモジュール名mysql.connectorにオブジェクト名や関数名を付加して、それらの機能を利用できるようになります。
一方、次のようにas mydb をつづけて追加すると、以後のプログラム内でモジュール名mysql.connectorに替えてmydbを利用できるようになります。その場合、mysql.connectorを使うとエラーになります。モジュール名を簡潔に記述できるようになります。
import mysql.connector as mydb
●データベースへの接続
mysql.connectorモジュールの mysql.connector.connect()メソッドを利用して、データベースへの接続を行います。
●接続するサーバとデータベース
ここで、接続するデータベースをまとめておきます。次に示す記事で作成したデータベースとテーブルを対象とします。
IoTのデータ集積場所としてMySQL communityの利用を検討する(2)
MySQL のGUIツールWorkbenchを使ってみる
ここで作成したデータベースの接続のための仕様は、次のようになります。作成したテーブル名はbasetable010です。
サーバ ‘localhost’ ポート ‘3306’ ユーザ ‘root’ パスワード ‘XXXXXXX’ データベース ’iodata’ |
具体的な接続は次のように行います。
con=mydb.connect( host='localhost', port='3306', user='root', password='********', database='iotdata' ) |
conの名で接続のオブジェクトを作成し、このオブジェクトをもとにそれぞれの処理を進めていきます。
mysqlのデータベースにアクセスするために、cursorオブジェクトのSQLの処理機能を利用します。具体的には、接続のオブジェクトconのcursor()関数で、新しくデータベースにアクセスするためのオブジェクトcurを次のように作成します。
cur=con.cursor()
具体的なテーブルへのアクセスは、execute()メソッドで行います。テーブルbasetable010から全データの取り出しを表示します。データの取り出しは、
cur.execute('select * from basetable010')
で行い、表示は、次のように記述します。
for row in cu:
print(row)
以上で、PythonでMysqlのデータべースにアクセスすることが確認できました。
次は、ESP32のマイコン・ボードから温度の測定データを、mosquittoでMQTTのプロトコルで通信する処理と共存できるか確認します。mosquittoの処理は、次に示す記事で通信の処理を行ったプログラムに今回の処理を追加してみます。
Pythonでmosquittoのブローカからデータを受ける(2)
paho(Paho-MQTT)とPythonでmosquittoのブローカと通信
今回テストした処理を、すべて関数senddb()として定義します。前回作成したmosquittoの処理プログラムに追加します。サブスクライブのデータを受信したときに起動されるCallback関数の中で、今回作成した関数senddb()を呼び出すようにします。
●関数化する
接続con=mydb.connectからcon.close()までを、senddb()の名の関数として定義します。次に示すように、defキーワードで関数名を定義します。引数が必要な場合は続く()の中で指定します。行末には:が必要です。
関数の範囲は、インデントで桁下げしているブロックとなります。プログラムを見やすくするために関数の後に2行の空白行を記述することが推奨されていますが、なくてもエラーにはなりません。
def senddb(): con=mydb.connect( host='localhost', port='3306', user='root', password='********', database='iotdata' ) cur = con.cursor() cur.execute('select * from basetable010') for row in cur: print(row) cur.close() con.close() |
前回使用したプログラムの2行目に、import mysql.connector as mydbを追加します。Callback関数のon_message関数の最後に、追加した関数を呼び出す命令senddb()を追加します。そのあと、senddb関数を追加して、テスト・プログラムを次に示します。
前回次に示す記事で行ったと同じように、Windowsのコマンドラインからmosquittoのブローカを起動し、ESP32のマイコンを起動します。
Pythonでmosquittoのブローカからデータを受ける(2)
paho(Paho-MQTT)とPythonでmosquittoのブローカと通信
その後に、今回作成したテスト・プログラムを起動すると、次に示すようにESP32のマイコンからのデータと(1から(7の見出しがついているmysqlデータベースからのデータが表示されます。
PythonでMysqlへのアクセスとmosquittoとの通信が行えました。次回は、senddb関数のmosquittoからのデータをmysqlのデータベースのテーブルに追加するものに修正します。
(2020/7/6 V1.0)
<神崎康宏>