Mysql高效插入/更新数据
从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<len(d2):
kvs=reduce(lambda x,y:"%s%s('%s' , '%s' , %s)"%(x,"" if x=="" else ",",y[0],dat,y[1]),d2.values[i:i+1000],"")
sqlstr="insert into caiwu (f_Code,f_Time,%s) values %s ON DUPLICATE KEY UPDATE %s=VALUES(%s)"%(fldname,kvs,fldname,fldname)
try:
db.doNonQuery(sqlstr)
except:
log.errorlogger().exception("数据入库错误!")
i+=1000
测试,基本上瞬间入库!
Mysql高效插入/更新数据的更多相关文章
- mysql 插入/更新数据
mysql 插入/更新数据 INSERT 语句 1.一次性列出全部字段的值,例如: INSERT INTO student VALUES('Chenqi','M', 29); INSERT INTO ...
- 【SQL模板】三.插入/更新 数据模板TSQL
---Name: 插入/更新 数据模板.sql ---Purpose: 用于更新 数据库中 历史数据 或 插入 新数据 的脚本模板 ---Author: xx ---Time: 2015-12-18 ...
- 解决Python向MySQL数据库插入中文数据时出现乱码
解决Python向MySQL数据库插入中文数据时出现乱码 先在MySQL命令行中输入如下语句查看结果: 只要character_set_client character_set_database ch ...
- SQL Server ->> DISABLE索引后插入更新数据再REBUILD索引 和 保留索引直接插入更新数据的性能差异
之前对于“DISABLE索引后插入更新数据再REBUILD索引 和 保留索引直接插入更新数据的性能差异”这两种方法一直认为其实应该差不多,因为无论如何索引最后都需要被维护,只不过是个时间顺序先后的问题 ...
- python 向MySQL里插入中文数据
用python向MySQL中插入中文数据出错,原代码片段: 1 db = MySQLdb.connect("localhost","root","12 ...
- 【mysql】批量更新数据
概述 批量更新mysql数据表数据,上网搜索基本都会说4~5方法,本人使用的更新方式为: INSERT ... ON DUPLICATE KEY UPDATE Syntax 可参见官方网站:inser ...
- MySQL批量插入大量数据方法
在MySQL数据库中,如果要插入上百万级的记录,用普通的insert into来操作非常不现实,速度慢人力成本高,推荐使用Load Data或存储过程来导入数据,我总结了一些方法分享如下,主要基于My ...
- 解决mysql无法插入中文数据及插入后显示乱码的问题
(1)废话不多说就是使用mysql数据库的时候无法输入中文,可以输入中文后显示的又是乱码!! (2开始解决问题: 第一步:找到安装mysql的目录找到 my.ini 文件: 第二步:使用记事本打开my ...
- 【MySQL】MySQL快速插入大量数据
起源 在公司优化SQL遇到一个索引的问题,晚上回家想继续验证,无奈没有较多数据的表,于是,想造一些随机的数据,用于验证. 于是 于是动手写.由于自己不是MySQL能手,写得也不好.最后,插入的速度也不 ...
随机推荐
- 《剑指offer》-表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1416&q ...
- DDD领域模型数据访问权限(九)
权限分为:数据权限和功能权限 数据权限: 查询提供附加表达式的支持: //提供附加表达式的支持 List<TAggreateRoot> GetByCondition(Expression& ...
- OpenLDAP在win2008上安装配置
业务需要,将企业员工信息统一管理,OpenLdap是目录数据库和一套访问协议组成的系统,适合使用,它有以下特点: LDAP的结构用树来表示 C/S模型,Server用户存储数据,Client为操作目录 ...
- Windows10 Compatibility Telemetry(CompatTelRunner.exe) 占用硬盘100%
相信很多人跟我一样总被Compatibility Telemetry(CompatTelRunner.exe) 占用硬盘100%困扰,Compatibility Telemetry翻译过来就是“微软兼 ...
- Codeforces 830C Bamboo Partition (看题解)
Bamboo Partition 列公式, 整除分块, 想不到, 好菜啊. #include<bits/stdc++.h> #define LL long long #define fi ...
- Codeforces Round #359 (Div. 2) D - Kay and Snowflake
D - Kay and Snowflake 题目大意:给你一棵数q个询问,每个询问给你一个顶点编号,要你求以这个点为根的子树的重心是哪个节点. 定义:一棵树的顶点数为n,将重心去掉了以后所有子树的顶点 ...
- split应用
/* input:"5 35 53 2 3" output:"2 3 5 35 53" */ public class RegexDemo4 { public ...
- 细说java中的类
前言 最近在学习<java编程思想> 学到了内部类 类不就是class吗 天天用 还能讲出花来了不成... 其实不然,在java中,类的种类和使用方式多种多样,花样繁多.其中主要有 普通类 ...
- 移动端滑屏全应用【一】cssHandler操作基础动画函数封装
前言: 大家都知道,在移动端进行操作结点移动时,我们都会使用操作transform来代替top等用以提高性能,必要的时候还可开启3d加速.我们都会使用getComputedStyle来获取结点的最终样 ...
- vue+axios实现移动端图片上传
在利用vue做一些H5页面时,或多或少会遇到有图片上传的操作,主要是运用html5里面的input[type=file]来实现,传递到后端的数据是以二进制的格式传递,所以上传图片的请求与普通的请求稍微 ...