通过Python从redshift读取数据将数据写入mysql数据库(遇到在插入mysql数据库的时候数据类型处理问题)

这几天在将数据从redshift读取数据然后写入mysql数据库自动创建表的,然后把数据插入到数库的操作。

我们通过读取sql的形式,将数据读取进来是一个dataframe。

data = pd.read_sql(sql, rs_engine)

然后再将这个dataframe写出去到mysql数据库通过

data.to_sql()的形式将数据写出去。

 但是在将读取到的数据写出到mysql数据库的时候数据类型原来的varchar 变为了text 类型,因为text类型在数据库当中占的内存非常多,所以我们要将数据类型进行转化。

如果不进行处理的话,varchar在读取进来是object 类型。写出去就是text 系统默认分配最长的长度给他。

所以我们通过 

desc tablename 这个时候我们看到数据类型是text。

通过网上找资料,我们要对数据类型进行转化。具体的做法如下:

def mapping_df_types(df):
    dtypedict = {}
    for i, j in zip(df.columns, df.dtypes):
        if "object" in str(j):
            dtypedict.update({i: NVARCHAR(length=255)})
        if "float" in str(j):
            dtypedict.update({i: Float(precision=2, asdecimal=True)})
        #if "float" in str(j):
            #dtypedict.update({i: Numeric(precision=18,scale=4, asdecimal=True)})
        if "int" in str(j):
            dtypedict.update({i: Integer()})
    return dtypedict

dtypedict = mapping_df_types(data)
data.to_sql(totablename,mysql_engine,schema=con["database"],if_exists='replace',
index=False,index_label=False, dtype=dtypedict)

定义一个函数,将字段和对应的数据类型进行重新匹配然后将数据生成mysql想要的数据类型。
具体的操作详见博客:https://blog.csdn.net/u011884100/article/details/90715359

至此问题得到解决:(执行的结果如下图所示)

 

 

posted on 2019-12-04 17:10  gxg123  阅读(893)  评论(0编辑  收藏  举报

导航