IoTに挑戦

【IoTに挑戦】残念ながら、問題点の原因はすべて自分が原因だった

データベース

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

スポンサーリンク

 

データベースへのインポートが上手くいかない。10件あるデータの内3件までしかインポートできない

 

どうして?

 

そう思って解析していくと、結局原因のすべては自分にあったことが分かった。

 

データベース

 

 

 

 

もう一度データを調べてみた

今回、事前に作ったデータをインポートしたときに、11件中4件のデータがインポートされ7件がWarningとなっている。

 

原因をしらべるべく、もう一度オリジナルのデータを確認してみた。

 

データ確認

 

中身は4つのデータしか取り込んでいない。

 

まずはオリジナルと比較するために、CSVのデータファイルをExcel形式のスプレッドシートに取り込んでみた。

データ1

このデータをみると、先頭行に何を表しているかの見出しが入っている。

 

しかし、データとしては10件分が登録されている。

 

Warningの原因を調べるために、以下のSQL文を実行してみた。

 

show warings ;

 

ワーニング

 

Warningの原因は空をセットしていると言う、Empty setと言う内容だ。

 

何故空を入れようとしているのか?

 

先頭の部分は必要ないので、まず削除しデータを10個に減らしてみる。

 

 

オリジナルデータ

この状態で、もう一度このデータを、MariaDBのテーブルにインポートしてみる事にする。

[ads]

 

その前に、現状のテーブル内容をすべてクリアし、テーブルを一度空の状態にする。

truncate table temphumd ;

 

これで空になったはずなので、中身が本当に空なのかを下記のSQL文で確認する。

select * from temphumd ;

 

Empty setとでたので、空であることが確認出来た。

 

もう一度、修正したCSVファイルをインポートする。SQL文は依然と変わらずでOKのはずだ。

 

load local data infile ‘/home/pi/rasptemp/temp_humd.csv’ into table temphumd fields terminated by ‘,’ optionally enclosed by ‘”‘ ;

 

 

 

同じ結果

 

データは3つになった。しかし、結果は同じになる。

 

 

プログラムは常に正しく間違いは自分にあり

もう一度テーブルの内容と、CSVのオリジナルファイルを比較しながら見ていった。

 

ずっと見ているが、内容は間違っていないようなのだが、何故3つしかデータが記録されないのか?

 

ずっと悩んでいたが、ふとある事に気が付いた。

 

そう、日付のデータ部分だ。

 

日付のデータは50分、51分、52分と1分間隔だ。しかしながら、オリジナルのCSVは50分が3つ、51分が3つ、52分が各時間ごとに3つのデータが存在する。

 

ここで自分はピンときた!

 

テーブルの日付部分はプライマリーキーに設定しており、重複は絶対に許さないようにしていた。

 

これがデータがWarningになる原因だ。

 

つまりまとめるとこうなる。

 

最初にデータを採取した際、DHT11は6秒以下ではデータの取りこぼしが発生するので、10秒以上開けてデータを採取するようにした。

 

この時点では、10~20秒間隔だったと思う。だから、各分で3つのデータが存在するのだ。

 

しかし、テーブルの定義上日時はプライマリーキーでユニークでなければならない。従って、同じ時間の部分は最初の1つを取り込み後は廃棄している。

 

もしこの時、秒までをデータとして扱っていれば、すべてがユニークになるので、こんな問題は発生しない。

 

つまりだ、Waringの原因は自分で設定したテーブルの定義によるものだった。

 

プログラムは指定された通りにどうさしており、間違っているのはやはり自分だった。

 

 

本当にそうなのかを検証してみる

それでは、自分の作ったテーブル定義が正しいと言うことを証明するために、今度は1分毎のデータを作成してみた。

 

新データ

 

今度のデータは確実に1分毎のデータになっている。先頭行は見出しなので削除して生粋にデータだけにする。

 

データ改

 

でき上ったデータをインポートしてみる。

load local data infile ‘/home/pi/rasptemp/temp_humd.csv’ into table temphumd fields terminated by ‘,’ optionally enclosed by ‘”‘ ;

 

データをインポート

 

select * from temphumd ;

今度はWarningは発生しなかった。そして、テーブルの中身を確認してみると、CSVファイルと同じ値がちゃんと格納されている。

 

これでCSVからインポートできる事が確認出来た。

 

 

まとめ

今回、CSVファイルをMariaDBの中のテーブルにインポートする作業で、かなり手こずった。

 

殆ど原因は、単純な思い込みから発生しているように思える。

 

昔。前の会社の先輩から言われた言葉が脳裏によみがえった。

 

プログラムは絶対に嘘をつかない。嘘をついているのは作っている本人だ。

 

確かに、今回の問題点はすべて自分が勝手に思い込んで、そうなるはずだから始まっていた。

 

改めて、プログラムは嘘をつかない、間違っているのは自分だと言う事を思い知らされた。

 

しかし、1つひとつが解決していくのは楽しいね。

 

楽しいと思えるか思えないかで、この先続けられるのかの分かれ道になるからね。

 

次は10分毎に、自動でデータを採取する仕組みを考えようかな。

 

 

[twt]

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