博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql高效插入/更新数据
阅读量:7085 次
发布时间:2019-06-28

本文共 1128 字,大约阅读时间需要 3 分钟。

从tushare抓取到的财务数据,最开始只是想存下来,用的办法想简单点,是:插入--报错—update

 

但发现这个方法太蠢,异常会导致大量无效连接,改为:

for idx,row in d2.iterrows():            try:                rs=db.getData("select f_Code,f_Time,%s from caiwu where f_Code=:1 and f_Time=:2"%fldname,row["code"],dat)                if len(rs)==0:                    db.doNonQuery("insert into caiwu (f_Code,f_Time,%s) values(:1,:2,:3)"%fldname,row["code"],dat,row[colname])                else:                    if rs[0][2] is None:                        db.doNonQuery("update caiwu set %s=:1 where f_Code=:2 and f_Time=:3"%fldname,row[colname],row["code"],dat)            except:                log.errorlogger().exception("数据入库错误!")

 

运行没啥大问题,但就是太慢,取两年数据,万条左右,一早上还没全部入库。只得研究优化,结果发现mysql居然有专门的语法,可以插入记录,遇到重复记录则为自动更新:

ON DUPLICATE KEY UPDATE

上面的处理直接用一条sql语句就解决了:

INSERT INTO TABLE (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1;

然后再进一步,批量入库也没问题,还能分别处理:

INSERT INTO TABLE (a,b,c) VALUES (1,2,3),(2,5,7),(3,3,6),(4,8,2)ON DUPLICATE KEY UPDATE b=VALUES(b);

简直不要太方便:

#数据入库:#   d2:待入库dataframe,第一列为code,第二列为数值#   dat:时间#   fldname:数据在库中的字段名def addtodb(d2,dat,fldname):        i=0    while i

测试,基本上瞬间入库!

转载地址:http://ungml.baihongyu.com/

你可能感兴趣的文章
WPF中的动画——(二)From/To/By 动画
查看>>
从零开始学测试【2】网页登录界面
查看>>
[Unity3D]Unity3D游戏开发之ACT游戏三连击效果实现综述
查看>>
键盘回车登录的做法
查看>>
优雅的使用python之环境管理
查看>>
取出当前脚本所在位置、文件名
查看>>
【转】每天一个linux命令(14):head 命令
查看>>
Careerdesign@foxmail.com
查看>>
mkdir failed for img Read-only file system
查看>>
写在2015年即将来临之际
查看>>
【UVA】434-Matty's Blocks
查看>>
MyISAM和InnoDB的区别
查看>>
boost.lexical_cast 学习
查看>>
Android中使用第三方jar包
查看>>
应用程序框架实战三十:表现层及ASP.NET MVC介绍(一)
查看>>
后端码农谈前端(HTML篇)第三课:常见属性
查看>>
NPOI系列
查看>>
virtual private catalog
查看>>
Android剪裁图片简单的方法
查看>>
iPhone/Mac Objective-C内存管理教程和原理剖析
查看>>