見出し画像

PythonからMariaDBへデータを追加する


どうも、じぇいかわさきです。

今回は、前回に引き続きPythonからMariaDBの制御方法について勉強していきます。

まずはPythonからテーブルにデータを追加する事をやってみましょう。

何時もやっている、ロト6の当選番号を登録する手順になります。



何故Pythonでデータ制御なのか?

その前に、何故Pythonでデータ制御ができないかについてお話します。

Pythonは今まで勉強してきたスクレイピングもそうですが、RPA(Robotics Process Automation)のように、動作を自動化させる事ができます。

今、自分が毎週2回ロト6の当選番号をデータに登録している作業の流れを見てみましょう。

まず、PCが立ち上がっており、同時にMariaDBがスタートしている状態から始めます。

①MariaDBにログイン
②使用するデータベースに切り替える
③データを追加するINSERT文をタイプしデータを入力する

このように、MariaDBにデータを追加するには、最低3ステップの動作が必要になります。

しかし、Pythonでコード化しておけば、③のデータを追加するINSERT文のうち、変更部分だけを書き直すだけで作業が完了します。

つまり、Pythonのコード化で1ステップの半分程度の作業で操作を完了することができるのです。

こんな些細な作業ですら、これだけ時間短縮と効率化ができるのですから、もっと大きな作業だとかなり改善できることになりますね。

という事で、昨日のコードの続きでデータ追加をする内容を見ていきましょう。



コードを追加してみる

SQL文でデータを追加するには、INSERT文を使用します。

昨日は、実際にデータが入っているのかの確認をするために、SELECT文を用いてすべてのデータを読み出しました。

この時に使ったコードで、cur.executeという部分がSQL文を実行させる部分になりますね。

つまり、curはデータベースに接続している状態でカーソル状態を制御していますね。

ゆえに、execute以降のSQL文をカーソル位置に代入した文を実行するのがcur.executeになりますね。

従って、この部分を修正してデータを追加する文に書き換えます。

昨日の当選番号を追加するには

cur.execute("INSERT INTO result (kaisai, date, No1, No2, No3, No4, No5, No6, bonus) values ('1559','2021/2/11','04','15', '17', '20', '26', '31', '43')")

とすれば、データテーブルの最後に昨日の当選データが追加されることになります。

そして、何時もやっているように、今回データを追加したことで最終データは第1559回になりますから、そこから24回前までのデータを抽出するようにします。

それが

cur.execute("select * from result where kaisai > 1559-24")

ですね。

実行させると結果は、以下のように表示されました。

[(1536, datetime.date(2020, 11, 19), 2, 5, 9, 30, 37, 40, 28), (1537, datetime.date(2020, 11, 23), 6, 13, 14, 32, 33, 37, 20), (1538, datetime.date(2020, 11, 26), 8, 14, 19, 33, 35, 40, 38), (1539, datetime.date(2020, 11, 30), 13, 29, 33, 37, 41, 42, 43), (1540, datetime.date(2020, 12, 3), 1, 20, 25, 28, 33, 37, 31), (1541, datetime.date(2020, 12, 7), 12, 26, 28, 32, 33, 35, 41), (1542, datetime.date(2020, 12, 10), 11, 12, 16, 17, 20, 36, 18), (1543, datetime.date(2020, 12, 14), 17, 21, 26, 33, 36, 38, 34), (1544, datetime.date(2020, 12, 17), 3, 11, 25, 26, 39, 42, 34), (1545, datetime.date(2020, 12, 21), 8, 14, 15, 26, 37, 43, 12), (1546, datetime.date(2020, 12, 24), 1, 18, 19, 24, 31, 40, 16), (1547, datetime.date(2020, 12, 28), 4, 11, 14, 17, 22, 39, 21), (1548, datetime.date(2021, 1, 4), 18, 24, 26, 35, 39, 42, 32), (1549, datetime.date(2021, 1, 7), 4, 5, 27, 28, 35, 41, 33), (1550, datetime.date(2021, 1, 11), 8, 11, 22, 32, 37, 42, 41), (1551, datetime.date(2021, 1, 14), 3, 14, 18, 24, 38, 43, 23), (1552, datetime.date(2021, 1, 18), 5, 9, 15, 30, 32, 39, 11), (1553, datetime.date(2021, 1, 21), 7, 8, 16, 32, 41, 42, 31), (1554, datetime.date(2021, 1, 25), 6, 14, 16, 27, 40, 42, 26), (1555, datetime.date(2021, 1, 28), 2, 8, 17, 23, 24, 27, 5), (1556, datetime.date(2021, 2, 1), 10, 19, 28, 30, 38, 42, 18), (1557, datetime.date(2021, 2, 4), 5, 21, 22, 23, 26, 39, 31), (1558, datetime.date(2021, 2, 8), 1, 12, 25, 27, 39, 42, 16), (1559, datetime.date(2021, 2, 11), 4, 15, 17, 20, 26, 31, 43)]
False

最後のFalseでデータベースから切り離し終了していることが確認できます。


それでは、実際にCSV形式でデータをエクスポートしてみます。

select * from result where kaisai > 1559-24 into outfile '/Users/******/24d-p.csv' fields terminated by ',';

結果はこのように、予定していた通りに出力されました。

間違いないですね。



最終的なコードはこのようになりました


import mysql.connector as mydb
import sys
conn = mydb.connect(
 host='localhost',
 port='3306',
 user='****',
 password='********',
 database='python_db'
)
cur = conn.cursor()
cur.execute("INSERT INTO result (kaisai, date, No1, No2, No3, No4, No5, No6, bonus) values ('1559','2021/2/11','04','15', '17', '20', '26', '31', '43')")
cur.execute("select * from result where kaisai > 1559-24")
cur.execute("select * from result where kaisai > 1559-24 into outfile '/Users/******/24d-p.csv' fields terminated by ',';")
print(cur.fetchall())
conn.close()
print(conn.is_connected())

少しずつですが、いろいろとできてきますね。


コードを書く環境ですが、最近はMicrosoftのVisual Studio Codeを使用しております。これも、自動的に保存されて、そのまま実行ができかつ、下段にターミナルを表示することができるので、すぐに結果もわかりデバックも可能です。

慣れてきたら、非常に使いやすいですね。JupyterNootbookより使いやすいような感じがします。

じぇいかわさきです。生産技術者として35年、今まで培った経験とスキルを元に、ものづくりに関わる世の出来事に対して思ったことをホンネで書いてます。ノウハウやアイデアもありますよ。 また写真も全力で撮っています、気に入った写真があればサポートや感想をぜひお寄せください。