1万を超えるレースデータを一括インポートしてみました。
実際は最初のfor文を回さず年ごとに3回に分けてインポートしました。1〜2KB約3400ファイルで2分掛からなかった感じです。
インポート直後にはphpMyAdminがダウンしますが、MAMPを再起動すると正常に動きました。
私が扱うデータ量程度ではMySQLのキャパを超えることはないと思います。
これからせっせとデータを入れていきます。
import csv,mysql.connector,glob
import pandas as pd
config = {
'user': 'root',
'password': 'root',
'host': 'localhost',
'port': 3306,
'raise_on_warnings': True
}
for year in range(2015,2017 +1):
# DB化するCSVファイルのパスとTable名(拡張子なしのファイル名)をリスト化する
file_l = list()
table_l = list()
for file in glob.glob(f'/horse_racing/race_result/{year}/*/*/*.csv'):
file_l.append(file)
table_l.append(file[-23:-4])
# CSVファイルの列タイトルをリストにする
df = pd.read_csv(file_l[0], encoding='Shift-JIS',header = None)
column_title = list(df.loc[0])
column_type = ['varchar(10)','int(2)','int(2)','varchar(200)','varchar(200)','float','varchar(200)','varchar(200)','varchar(200)','varchar(200)','varchar(200)','varchar(10)','varchar(10)','varchar(10)','varchar(200)','varchar(200)','varchar(200)','varchar(200)','varchar(200)','varchar(200)','varchar(200)','varchar(13)','int(9)']
# SQL文に使う列タイトルの文字列を作成する(角括弧を丸括弧に置換えるなど)
column_l = list()
for ti,ty in zip(column_title,column_type):
column = ti + ' ' + str(ty)
column_l.append(column)
column_l_str = str(column_l).replace('[','(').replace(']',')').replace("'",'').replace('(万円)','')
# sqlのリストを作成
sql_l = list()
for table in table_l:
sql = f"create table horse_race_result.{table} {column_l_str}"
sql_l.append(sql)
# mysqlに接続
conn = mysql.connector.connect(**config)
cur = conn.cursor()
# データベースhorse_race_resultにtableを作成する
for file,table,sql in zip(file_l,table_l,sql_l):
cur.execute(sql)
cur.execute('begin')
# CSVファイルを読み込み、各行をtableに挿入する
with open(file, 'rt', encoding='Shift-JIS') as f:
reader = csv.reader(f)
for i,row in enumerate(reader):
print(f'row {row}')
if i != 0:
row_str = str(row).replace('[','(').replace(']',')')
print(row_str)
sql = f'insert into horse_race_result.{table} values {row_str}'
print(sql)
cur.execute(sql)
cur.execute('commit')
conn.close()