前回は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()