[Python] 238 tkinter 18 MySQLツールのGUI化

MySQLツールの土台ができたので早速GUI化しました。

いつものガワを使い回しです。

今は競走馬成績検索のみですが、少しずつ拡充していきます。

次は過去レース検索あたりでしょうか。

import glob,os,shutil
import sys,json
import tkinter as tk
import tkinter.font as font
from tkinter import ttk
from HR_library import mysql_search # [Python]237のコードをモジュール化

<中略>

for i in range(100): # 100回処理可能
    # 馬名の入力を待機
    btn.wait_variable(var_act)

    # 入力した馬名を取得
    name = entry.get()

    # 競走馬成績を検索
    mysql_search.Mysql_search().horse_result(name)

root.mainloop()

[Python] DB仮完成までの道のり

昨年の今頃は主要都道府県のコロナ集計データをスクレイピングしていました。サイトの形式が自治体によってバラバラかつ頻繁にXPathが変わるのでコード管理が大変でした。今はYahoo!のトップに特集サイトがあるのでそれを利用しています。

プログラミング未経験者が2018年春にスクレイピングにいきなり挑戦して玉砕。一昨年12月にホビープログラマとなり、2020年3月から本格的にスクレイピングに取り組み始めて関係ないコードも色々書きながらここまで1年ちょっと掛かりました。感慨深いものがあります。

これまで何冊か関連本を購入しましたが積ん読状態でスクールも利用せず、ほとんど開発ドキュメントやネット情報だけでここまで来ました。

プログラミング学習を通して、自分が座学やビデオ・書籍を使った学習に向いていないことが改めて良くわかりました。

何かを知りたいと思った時にすぐに関連情報を収集し、自分なりに仮説を立て検証を繰り返すというやり方が向いているようです。

実践を通して経験値を増やし、後から体系化していく感じでしょうか。とにかく能動的に学習しないと身につかないです。

理論科学よりも実験科学が好きなのも、そういった性格によるものでしょう。

[Python] 237 MySQL 05 馬名からレース検索・CSV出力

馬名からのhorseID検索、raceID検索、レース名検索を全てMySQLで実行しました。

結果出力までたった1秒の高速処理でかなり快適です。

CSVファイルは開けたときの見栄えが今ひとつなのでHTML化も考えています。

import mysql.connector,glob,csv,re,datetime,sys

config = {
  'user': 'root',
  'password': 'root',
  'host': 'localhost',
  'port': 3306,
  'raise_on_warnings': True
}

print('検索したい馬名を入力してください')
name = input()

conn = mysql.connector.connect(**config)
cur = conn.cursor()

horseID_l = list()
for y in range(1986,2019 +1):
	table = f'horse{y}'
	try:
		cur.execute(f'SELECT horseID FROM horse_list.{table} WHERE 検索馬名 = "{name}"')
	finally:
		result = cur.fetchall()
		if result != []:
			horseID_l.append(result)

print(horseID_l)

if len(horseID_l) >= 2:
    print('該当する馬が複数います。番号を入力してください。')
    for i,data in enumerate(horseID_l):
        print(f'{i+1} {data}')
    num = input()
    id = str(horseID_l[int(num)-1][0]).replace('(','').replace(')','').replace(',','')

elif len(horseID_l) == 0:
    print('該当する馬はいません')
    sys.exit()

else:
    id = str(horseID_l[0][0]).replace('(','').replace(')','').replace(',','')

print(f'検索馬のID {id} 誕生年 {id[0:4]}')

start_year = int(id[0:4]) + 2
print(f'最短デビュー年 {start_year}')

data_l_pre = list()
for y in range(start_year,2021 +1):
	table = f'race_r_{y}'

	try:
		cur.execute(f'SELECT 着順,枠番,馬番,斤量,騎手,タイム,通過,上り,単勝,人気,馬体重,賞金,raceID FROM horse_race_result.{table} WHERE horseID = {id}')
	finally:
		result = cur.fetchall()
		# print(result)
		if result != []:
			data_l_pre.append(result)

# ネストを平滑化する
data_l = [e for l in data_l_pre for e in l]

print(f'出走数 {len(data_l)}')
print(data_l)

raceID_l = [l[-1] for l in data_l]
print(raceID_l)

data2_l_pre = list()
for id in raceID_l:
    table = f'race_n_{id[1:7]}'
    try:
        cur.execute(f'SELECT 日付,開催,レース,レース名,コース,天候,馬場状態 FROM horse_race_name.{table} WHERE raceID = "{id}"')
    finally:
        result = cur.fetchall()
        if result != []:
            data2_l_pre.append(result)

# 接続終了
cur.close()
conn.close()

# ネストを平滑化する
data2_l = [e for l in data2_l_pre for e in l]

print(f'data2_lデータ数 {len(data2_l)}')
print(data2_l)

# ソート用日付データの作成
date_l = list()
for d in data2_l:
    date = d[0]
    date_dt = datetime.datetime.strptime(date,'%Y年%m月%d日')
    date_d = datetime.date(date_dt.year, date_dt.month, date_dt.day)
    date_l.append(str(date_d))

print(f'date_lデータ数 {len(date_l)}')
print(date_l)

# レースデータ、結果データ、日付データを結合する
data3_l = list()
for a,b,c in zip(data2_l,data_l,date_l):
    d = list(a) + list(b) + [c]
    data3_l.append(d)

print(f'data3_lデータ数 {len(data3_l)}')
print(data3_l)

# 日付でソートする
data4_l = sorted(data3_l, key=lambda x: x[-1])
print(f'data4_lデータ数 {len(data4_l)}')
print(data4_l)

# 列タイトルを追加する
column_title = [['日付','開催','レース','レース名','コース','天候','馬場状態','着順','枠番','馬番','斤量','騎手','タイム','通過','上り','単勝','人気','馬体重','賞金','raceID','ソート用日付']]
data5_l = column_title + data4_l
print(f'data5_lデータ数 {len(data5_l)}')
print(data5_l)

# 結果ファイルの作成
datetime_now = datetime.datetime.now()
datetime_now_str = datetime_now.strftime('%y%m%d%H%M')
filename = f"/Desktop/{datetime_now_str}_mysql.csv"

with open(filename, 'w', newline='',encoding = 'shift_jis') as f:
    writer = csv.writer(f)
    writer.writerows(data5_l)