[Python] 235 MySQL 03 CSVを一括インポートする

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