Python で、Excelファイルを受け取り MySQL DBに簡単にデータをセットする。
PCで実行するので、用意する Python スクリプトは、pyinstaller で EXE化をする。
DB接続情報とシートにデータを書き込んだ Excel ファイルを
ドラッグアンドドロップでPython スクリプトEXEファイルに送れば、接続から
データのインサートまでやってくれる。
仕様は、、、
・Excelファイルは「接続情報」という名のシートを必ず用意する。
・「接続情報」シートは以下の通り、
・「接続情報」シートに書く、host名などこの書式(セルの位置)を崩してはならない。このフォーマット守ること。
・INSERTするテーブル名のシート名にデータを書く
・INSERTするテーブルのシートは、必ず1行目にテーブルカラム名を記載する
・2行目以降に格納するデータを記載する。
・サポートするデータ型は、Excelのセルの書式に依存して、文字列、数値、TimeStamp(日付時刻)
・日付時刻は、yyyy/MM/dd HH:mm:ss の書式
・空セルは、NULLでINSERT する
・シート名のテーブルに対して、TRUNCATE TABLE を実行してから INSEERT を行う。
・記載したテーブルの値の主キー重複違反などのチェックは実行しないので、データ記載に注意すること。
・実行後は、Python の os.system("PAUSE") 実行により DOSコマンドプロンプトで何かキーをクリックするまで終了しない
Python スクリプトは、以下でこれを PyInstaller で EXE化すればよい
# -*- coding: utf-8 -*- # VsetMySQL.py : Excel → mysql データセット # import os import sys import mysql.connector import openpyxl import datetime from traceback import format_exception class VsetMySQL(): def __init__(self, file): self.file = file self.book = openpyxl.load_workbook(self.file) def transaction(self, truncatesql, sql): sheet = self.book['接続情報'] try: connect = mysql.connector.connect(host=sheet["B1"].value, port=sheet["B2"].value, user=sheet["B3"].value, password=sheet["B4"].value, database=sheet["B5"].value, charset=sheet["B6"].value) cur = connect.cursor() cur.execute(truncatesql) cur.execute(sql) connect.commit() except BaseException as e: connect.rollback() print(''.join(format_exception(type(e), e, e.__traceback__))) finally: connect.close() def cellToValue(self, cell): if type(cell) is str: return "'%s'" % cell elif type(cell) is int: return "%d" % cell elif type(cell) is datetime.datetime: return "'%s'" % cell.strftime('%Y-%m-%d %H:%M:%S') elif cell is None: return "NULL" def execute(self): for table in [e for e in self.book.sheetnames if e != "接続情報"]: sql1 = "TRUNCATE TABLE " + table + ";" sheet = self.book[table] row = list(sheet.values) sql = "INSERT INTO %s (%s)VALUES" % (table, ", ".join(row[0])) ary = [] for r in row[1:]: l = ", ".join(list(map(lambda x: self.cellToValue(x), r))) ary.append("(" + l + ")") sql2 = "%s\n%s\n;" % (sql, ",\n".join(ary)) print(sql1) print(sql2) self.transaction(sql1, sql2) if __name__ == '__main__': args = sys.argv if len(args) == 2: if os.path.isfile(args[1]): vset = VsetMySQL(args[1]) vset.execute() else: print("Not Found %s" % args[1]) else: print("Usage: VsetMySQL.exe file") os.system("PAUSE")