背景:
1、读取excel数据上传到oracle数据库。先用pandas读取excel,然后将pandas转换成np.array。最后将np.array转换成list
2、使用executemany批量插入数据库时报错TypeError: expecting string or bytes object
#读取excel
df = pd.read_excel(request.FILES.get("excel_data"), sheet_name=0)
# Nan 替换为 None
none_df = df.where(df.notnull(), None)
#转换为ndarray
np_data = np.array(none_df)
#转换为list
data_list = np_data.tolist()
#sql
insert_sql="insert into table (column1,column2,column3) values (%s, %s, %s)"
#预处理
cursor.prepare(insert_sql)
#插入数据库
cursor.executemany(insert_sql, data_list)
cursor.commit()
问题原因:
由于excel中某一列中既有数字又有字符串,导致executemany没有识别到这一列的格式
解决方法:
在pandas使用类型转换转换成自定义的格式,这样就不会报错
#读取excel
df = pd.read_excel(request.FILES.get("excel_data"), sheet_name=0)
# Nan 替换为 None
none_df = df.where(df.notnull(), None)
#-----在这一步指定列的类型-------------------
none_df["col"]=none_df["col"].astype("str")
#------------------------------------------
#转换为ndarray
np_data = np.array(none_df)
#转换为list
data_list = np_data.tolist()
#sql
insert_sql="insert into table (column1,column2,column3) values (%s, %s, %s)"
#预处理
cursor.prepare(insert_sql)
#插入数据库
cursor.executemany(insert_sql, data_list)
cursor.commit()