【Pythonの勉強】馬券購入履歴取得プログラムの作成 その4

前回までのおさらい

前回は、Club JRA-Netに保存されているすべての投票内容を取得するところまで書きました。
【Pythonの勉強】馬券購入履歴取得プログラムの作成 その3

あとは、取ってきたデータをMySQLに格納するだけです。
しかし、MySQLのテーブルを作成したところで文字コードのアクシデントが発生。
DBとテーブルのdefault charasetがlatin1になってしまったので、utf-8に修正することになりました。
MySQLでテーブルを作ったらdefault charasetがlatin1になった

無事テーブルも作成できたので、これでようやくデータをセットすることができます。

MySQLのテーブルにデータをセット

今回は馬券購入履歴を2つのテーブルに格納します。

・明細テーブル
・集計テーブル

テーブルが2つに分かれているので、SQL文も2つ用意する必要があります。

まずは、投票内容照会画面の明細部分は明細テーブルにデータをINSERT。
そして、一番下の合計のところだけ、集計テーブルにデータをINSERTです。
両者とも、キーとなる値でテーブルを検索し、存在していない場合のみINSERTします。

画面の項目はリストに格納されているので、一部の項目を成形してからSQL文を組み立てます。

リストには、明細も合計も同じように入ってきますので、どちらのテーブル対するSQLを作るのか判定が必要になります。
しかし、なかなかスマートに判断ができません。
結局、通番の値が”合計”となっている場合は、集計テーブル用のSQLを流し、それ以外は詳細テーブル用のSQLを流すことにしました。

次に、購入金額や払戻金額は値を成形する必要があります。
具体的には、”,”と”円”を空白に置換する処理になります。

しかし、ここで問題が発生してしまいました。
購入金額には表示形式が2パターンあるのです。

①金額が単独でセットされる場合
②金額が単価と合計に分かれて2行でセットされる場合

単純に”,”と”円”を空白にするだけではいけないようです。

結局、以下の方法で対処しました。

①項目の先頭から1文字ずつ見ていく
以下ループ内の処理
    ②0~9の場合、変数tempに追加
    ③"円"かつ変数unitに値が入っていない場合、変数unitに代入し、変数tempをクリア
ループ明けに以下の処理
④変数tempが空の場合、変数unitの値を変数totalに代入
 変数tempが空でない場合、変数tempの値を変数totalに代入

これで、単価と合計の項目に正しく値が入るようになりました。
あとは、合計と詳細でSQL文を分けてリストの項目と組み合わせることで完成です。

SQLが完成したので試しに実行してみると、途中でエラーになってしまいました。
エラーの内容を確認すると、「場名」にDBの項目の長さを超える値をINSERTしようとしていたみたいです。

おかしいと思って対象のレコードを確認すると、すぐに原因が分かりました。なんと、エラーになったのはドバイのメイダン競馬場の購入履歴だったのです。
日本の競馬場しか考慮していなかったので「場名」は2文字=varchar(4)としていたのです。

なるほど。
海外競馬が最近行われていてよかった。

DBの項目の長さを変更して、再度実行するとデータが正しくセットされました。

これでようやくデータのセットができるようになりました。
かなり適当にプログラムを書いてしまったので、ここで一度プログラムの見直しをしたいです。
そして、一度1から作り直してみたいと思います。

次回作の展望ですが、もうちょっと現実的に役に立ちそうなものを作ってみましょう。
何かWEBサイトを立ち上げるのがいいかなー。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする