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

posted @ 2022-06-09 14:47  傻白甜++  阅读(252)  评论(0编辑  收藏  举报
TOP