[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)