プログラミング

【Python3】データベースにデータを登録する方法(完成編)

連続書き込み

おはようございます。じぇいかわさきです。

 

Python3を使って、MariaDBへデータを登録する方法なんですが、実は昨日までの内容では固定値は登録できるところまで行ったが、実はDHT11から自動的に取得するにはできない事が判明。

 

何を言っているか?

 

連続書き込み

前回書き込みでは、書き込み値の部分を、VALUES (now(), ‘27.6’, ‘67.8’)というふうに、実際にデータを入力した状況ではなかった。

 

実際に動作させてみると、先の27.6とか67.8と言う部分似データが引き渡されないんだ。

 

 

 

どのようにすればよいのか?

最初に行ったこと。

 

今までやって来たことで、この気温と湿度は数値から文字列に変換しデータベースに登録しなければならない。

 

それは、データベースのテーブルを作る際に、以下のようなSQL文でテーブルを作っているからだ。

create table test_sample ( date varchar(20) not null, temp varchar(5) not null, humd varchar(5) not null, primary key (date));

 

従って、数値→文字変換として以下のようにした。

temp=str(‘27.6’)
humd=str(‘67.8’)
cur=conn.cursor()
cur.execute (“INSERT INTO test_sample (date, temp, humd) VALUES (now(), temp, humd)”)

 

この状態で実行しても、各変数には予定の文字が入るのだが、SQL文には引き渡されない。NULではなくブランクが入っているようだ。

[ads]

 

何度やってもダメ。文字列の引き渡しだということから、tempとhumdの部分を’’で囲ってみた。

temp=str(‘27.6’)
humd=str(‘67.8’)
cur=conn.cursor()
cur.execute (“INSERT INTO test_sample (date, temp, humd) VALUES (now(), ‘temp’, ‘humd’)”)

 

実行すると、なんと数字が文字列として入るのではなく、temp、humdと言う文字がテーブルに入ってしまった。

 

少なくとも、方法自体は間違っていないと思うのだが。

 

 

そもそも間違っているのでは?

まず、データの扱い方について考えてみた。

 

数値をわざわざ文字列に変換してから登録する意味があるのだろうか?

 

まず、テーブルを一旦削除して、新しいテーブルを作成してみる。

 

tempとhumdを文字列のvarcharから、数値そのもののINTに変更した。

create table test_sample ( date varchar(20) not null, temp int not null, humd int not null, primary key (date));

 

このテーブルにデータを流し込むには、以下のようにしてみた。

temp=27.6
humd=67.8
cur=conn.cursor()
cur.execute (“INSERT INTO test_sample (date, temp, humd) VALUES (now(), temp, humd)”)

[ads]

 

しかし、この状態でもダメ。tempとhumdの部分には0が入るようになってしまった。これはコラムの属性を数値に変更したので、こうなったんだと思う。

 

解決方法は無いのか?ネットで調査していくと、INSERT文の方法で対応する方法があるようだ。

 

 

やっとデータが入るようになった

なんだかんだと手を変え品を変えて修正してきた結果、最終的に以下のようになった。

最終形

SQL文を1列で書いている間、なかなかうまく行かなかったので、SQL文の主な部分と、代入する部分とを組合せて使う方法に変更してみた。

 

つまりこんな感じ

従来

temp=27.6
humd=67.8
cur=conn.cursor()
cur.execute (“INSERT INTO test_sample (date, temp, humd) VALUES (now(), temp, humd)”)

   ↓

変更後

cur=conn.cursor()
temp=27.6
humd=67.8
sql = “INSERT INTO test_sample (date, temp, humd) VALUES (now(), %s, %s)”
data = (temp,humd)
cur.execute (sql, data)

 

この結果、データにtempとhumdが入るようになったが、小数点以下が四捨五入されてtempが28、humdが68という数値がデータの入った。

 

どうやら数値の属性画を間違えたようだ。INTではなく、FLOATが正しいみたいだね。

 

そこでもう一度テーブルを削除して再構築する。

create table test_sample ( date varchar(20) not null, temp float not null, humd float not null, primary key (date));

 

実行してみると、tempの27.6、humdの67.8が入りこれで正しくデータが入るようになった。

 

連続して、後2つ実行しても、時間が変わり同じデータが正しく入ることが分かった。

データ入力完了

 

これで求めていた動作がやっとできるようになった。

 

今度は、ラズパイに移植して最終的にcronで10分おきにデータを入手することができるのかを確認する必要がある。

 

 

まとめ

 とりあえず、数値データならどうにかデータベースに書き込むことができるよになった。

 

後は、実際にcronで動かしてデータを採取してみないことには、本当に問題ないのかは分からない。しかし、課題としては文字列の代入ができていないことは未だ解決できないことは残ったままだ。

 

これまで自力でなんとかやって来たが、やはり限界のような気もしないではない。

 

以前に、ドットインストールで学んだのだが、ここまで細かなことは習っていないような気がする。

 

まず、ラズパイに移植することと同時に、今度はPROGATEでPythonを学んで行こうかと思っている。

 

次はラズパイでの結果と、PROGATEでの学習内容でも初回していきたいと思う。

 

人生、生涯学習。このまま頑張っていこうかと思っている。

 

 

 

[twt]

 

ABOUT ME
じぇいかわさき
進撃の社畜/弱小プロブロガー 本ブログは、還暦で定年の世代の筆者が、まだまだやれるという事を証明するために新たな事に挑戦した事を情報発信しているブログです。同世代の人達に対して、まだまだいろいろと頑張れる、第二の人生を楽しく生きていく為に現状維持は退化、失敗の反対は行動しないことを座右の銘とし、思い立ったことにチャレンジした記録です。また、せっかく稼いだ収益を騙し取られないように、毎日来る迷惑メールなどのネットリテラシーについても情報発信をしています。最近はプログラムにも挑戦しだしました。 このブログは ネットリテラシー ブログ 働くこと について書いており、第二の人生で頑張る同世代の心に刺さる記事を目指してます。人生100年、まだまだがんばれます。 >> Twitterをフォローする