[Python] 213 MySQL 02 CSVファイルをインポートする

前回はphpMyAdminを使ってインポートしましたが、今回はPythonでやってみました。

プログラムとデータベースの融通の効かなさが合わさって、正直言ってこの程度のコードでも頭にダメージを受けました。

随所にprint文を入れているところに苦闘の跡がうかがえます。Microsoft Accessで苦労していた頃を思い出します。

書き上げればあとは楽なんでしょうが、そこまでたどり着けるのか自信がありません。

import csv,mysql.connector
import pandas as pd

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

# DB化するCSVファイルの名前
filename = 'race202001010102.csv'

# CSVファイルのタイトル行の内容とtypeをリストにする
df = pd.read_csv(filename, encoding='Shift-JIS',header = None)
column_title = list(df.loc[0])
column_title_type_pre = [type(l) for l in df.loc[1]]

# typeは全て20字以内の文字列とする
# column_title_type = ['varchar(20)']*len(column_title)でも可
column_title_type = []
for t in column_title_type_pre:
    if 'str' in str(t):
        column_title_type.append('varchar(20)')
    if 'float' in str(t):
        column_title_type.append('varchar(20)')

print(column_title)
print(column_title_type)

# SQL文に使う列タイトルの文字列を作成する(角括弧を丸括弧に置換えるなど)
column_l = []
for ti,ty in zip(column_title,column_title_type):
    column = ti + ' ' + str(ty)
    column_l.append(column)

print(column_l)

column_l_str = str(column_l).replace('[','(').replace(']',')').replace("'",'').replace('(万円)','')

print(column_l_str)

# mysqlに接続
conn = mysql.connector.connect(**config)
cur = conn.cursor()

# データベースhorse_racingにtable_testを作成する
sql = f"create table horse_racing.table_test {column_l_str}"
cur.execute(sql)
cur.execute('begin')

# CSVファイルを読み込み、各行をtableに挿入する
with open(filename, '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_racing.table_test values {row_str}'
            cur.execute(sql)

cur.execute('commit')
conn.close()