python的to_sql那点儿事
时间:2022-07-26
本文章向大家介绍python的to_sql那点儿事,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
to_sql结论
- 可以对齐字段(dataframe的columns和数据库字段一一对齐)
- 可以缺少字段(dataframe的columns可以比数据库字段少)
- 不可以多出字段,会报错
- if_exists='append’进行新增(bug:如果设置了PK,ignore 和 replace会报错)
- 一定要先创建好数据库,设置好格式,
- 否则使用if_exists='append’自动创建的字段格式乱七八糟
项目需求
- excel表格按字段存入数据库,近几年的excel表格,业务系统几经迭代
- 所以每张表格的字段顺序不一致,甚至有的字段已经不需要剔除了
我本以为python的to_sql是按顺序一一映射进mysql里,
于是便有了下面这篇特憨的一篇的文章:
Python:dataframe写入mysql时候,如何对齐DataFrame的columns和SQL的字段名?
当时找遍了百度、CSDN都没找到解决办法,
偶然间灵感乍现的思路,还以为自己开创了先河
现在想想当时多么自豪,现在就有多羞愧!
不过几经迭代,倒也帮我解决了to_sql不能 ignore和replace的问题
代码比对
to_sql代码
#构建数据库连接
engine=create_engine(f'mysql+pymysql://{user}:{passwd}@{host}:3306/{db}')
#可以对齐字段,以及缺少字段;不可以增加字段
data.to_sql(sql_name,engine,index=False,if_exists='append')
自定义w_sql (迭代后版本)
# 定义写入数据库函数
def w_sql(sql_name,data,db_name,host=host,user=user,passwd=passwd):
zd=""
for j in data.columns:
zd=zd+j+","
connent = pymysql.connect(host=host, user=user, passwd=passwd, db=db_name, charset='utf8mb4') #连接数据库
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=u"""insert ignore into %s (%s) values(%s)"""%(sql_name,zd[:-1],va[1:])
sql=u"""replace into %s (%s) values(%s)"""%(sql_name,zd[:-1],va[1:])
cursor.execute(sql)
connent.commit() #提交事务
cursor.close()#关闭游标
connent.close()#断开连接
优劣对比
对比项 |
to_sql |
自定义w_sql |
---|---|---|
运行速度 |
整表写入,运行速度快 |
一行行写入,运行速度特慢 |
新表创建 |
提前创建(格式问题,函数本身可以创建) |
提前创建 |
字段对齐 |
可以对齐 |
可以对齐 |
字段多余 |
报错警示 |
报错警示 |
主键处理 |
不可以ignore |
可以ignore |
数据修改 |
不可以修改 |
replace替换 |
运行速度慢可以说是这个自定义函数唯一
也是最大,甚至于说致命的劣势!
这也是我为什么会发现我这么憨的原因
毕竟自从有了这个自定义函数,以往都是无往而不利的,
基本上没在使用过to_sql
如果不是碰到了那个她
一个上百万行的excel文件
我恐怕这辈子都不会发现 to_sql的秘密
庆幸的是相比去年多少进步了点儿,知道测试了,不只是凭感觉了
总的来说,自定义的sql写入语句更灵活,但是相对于to_sql官方函数来说效率比较低下,如果参考下源码,或许可以优化下效率问题,如果有更好的想法,欢迎评论交流!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 60亿次for循环,原来这么多东西
- 不要再问我 in,exists 走不走索引了...
- 知乎太可恶了,一言不合就封号?
- 5年Java开发经验,面试挂在MySQL InnoDB上!大厂究竟多看重MySQL?
- 是你们的力量,让知乎看见了!
- 视屏面试传输协议到底是TCP还是UDP
- prometheus学习笔记(1)-mac单机版环境搭建
- Metaspace内存不足导致FGC问题排查
- useful-scripts
- 清空所有 NSUserDefaults 记录
- 重温Java Web的技术细节
- 国密算法SM2加解密_签名验签图形化例子
- 链接脚本linker script的妙用
- 【TBase开源版测评】轻松愉快去O选项:TBase
- Tungsten Fabric知识库丨更多组件内部探秘