おはようございます。じぇいかわさきです。
データベースへのインポートが上手くいかない。10件あるデータの内3件までしかインポートできない。
どうして?
そう思って解析していくと、結局原因のすべては自分にあったことが分かった。

もう一度データを調べてみた
今回、事前に作ったデータをインポートしたときに、11件中4件のデータがインポートされ7件がWarningとなっている。
原因をしらべるべく、もう一度オリジナルのデータを確認してみた。

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

このデータをみると、先頭行に何を表しているかの見出しが入っている。
しかし、データとしては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]
