python3

【メモ】mysql.connector-python を用いたときにpython floatがInsertできないといわれた時の方法

mysql.connector-pythonでInsert用いたときのデータ形式

mysql.connector-pythonはどうもnumpy.float形式やtimestamp形式をinsertしてくれないようで

dataはnumpy array 1列目がtimestampの設定です。

numpymysql.py
import numpy as np
import pandas as pd
import datetime as dt
import mysql.connector as ms

class NumpyMySQLConverter(ms.conversion.MySQLConverter):
    """ numpy typeを用いるためのmysql.connector Converter """
    def _float32_to_mysql(self, value):
        return float(value)
    def _float64_to_mysql(self, value):
        return float(value)
    def _int32_to_mysql(self, value):
        return int(value)
    def _int64_to_mysql(self, value):
        return int(value)

def insert_sql(data):
    func_date=np.vectorize(lambda x: dt.datetime(x.year, x.month, x.day, x.hour, x.minute, 0))
    date_data=func_date(data[:,0])
    dbh = ms.connect(
        host=[host_name],
        user=[user_name],
        db=[data_base_name],
        charset='utf8')
    dbh.set_converter_class(NumpyMySQLConverter)
    stmt = dbh.cursor(buffered=True)
    sql = ('INSERT INTO `TABLE`'+
           '(`COLUMN1`, `COLUMN2`) '+
           'VALUES (%s, %s)')
    for i in range(data):
            input_data=(date_data[i], date[i,1])
            #エラーハンドリング
            try:
                stmt.execute(sql, input_data)
            except:
                dbh.commit()
                stmt.close()
                dbh.close()
                return input_data
           #autocommitではないので、明示的にコミットする
           dbh.commit()
    #回線の閉鎖
    stmt.close()
    dbh.close()

とりあえず動いたのでこれで良しと
NumpyMySQLConverterがうまくいくのかいまいち理解はしていません。