这几天在将数据从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
至此问题得到解决:(执行的结果如下图所示)