dataframe写入mysql时候,对齐DataFrame的columns和SQL的字段名
在python中
sql=“xxxxxxxx”
cursor.execute(sql)
execute提交的是 个字符串,所以考虑格式化字符串传参
insert into (%s,%s,%s,%s、、、、)values(%s,%s,%s、、、)
1
这样的结果就是当字段特别大的时候能累死,而且我又很懒
最重要的是当换个数据库的时候又废了
sql="insert into (%s,%s,%s,%s、、、、)values(%s,%s,%s、、、)"
1
都在引号里面,n个 %s 和一个 %s 也没什么区别吧!!!
所以我就想着把整个字段名和逗号一起拼接成一个字符串
import pymysql import pandas as pd import numpy as np # 定义函数 def w_sql(sql_name,data,zd): connent = pymysql.connect(host='xxx', user='xxx', passwd='xxxx', db='xxxx', charset='xxx') #连接数据库 cursor = connent.cursor()#创建游标 for i in data.values: va="" for j in i: if pd.isnull(j): va=va+","+'null' #缺失值判断和转换 else: va=va+","+"'"+str(j)+"'" sql="""insert ignore into %s (%s) values(%s)"""%(sql_name,zd[:-1],va[1:]) # print(sql) cursor.execute(sql) connent.commit() #提交事务 cursor.close()#关闭游标 connent.close()#断开连接 #主程序 data=pd.read_excel("./test.xlsx") sql_name='test' zd="" for j in data.columns: zd=zd+j+"," w_sql(sql_name,data,zd)
结果如下图,字段始终对齐,不受位置干扰,
【注意】
①ignore 是忽略主键重复,
最开始的版本是不设置主键,选取dataframe第一个元素在 数据库里进行select,
版本二 发现第一个元素不准,所以又read_sql_table读取整个数据库,对dataframe 进行布尔筛选
…
最终拼接了个主键,用ignore忽略重复——注意去除警告,否则多次运行就会一片红红火火
这里给出警告过滤的代码
# 警告过滤
# 可以通过调用filterwarnings()将规则添加到过滤器
# 并通过调用resetwarnings()将其重置为默认状态
# warnings.filterwarnings("ignore")
1
2
3
4
②因为是拼接的字符串所以数据库对应要设置为char/varchar
③commit的缩进位置
因为是dataframe一行行执行写入,最后循环完一整个dataframe统一commit
当数据量大的时候commit的位置很影响效率
connent.commit() #提交事务
原文链接:https://blog.csdn.net/qq_35866846/article/details/101712273