上周同事又问一个问题:表 C_Application 中数据量较大,需要批量更新 load_start_time 的时间为 '1900-01-01 18:43:49' 为初始值,以一定时间间隔且每次更新数据量为2000笔的时间设定。

如何进行快速的数据更新操作(其初始手动单批次更新,更新效率比较低;后找开发也未提供给其比较好的方案)?

其实,此种问题的解决并不难,因为目标明确。可以通过最笨的分布式更新(多人单批次同步更新)、Excel拼sql更新等等,相信大家也可以想出很多的方法。如下提供两种基础解决参考(均为未完成的,或者说是有问题的),感兴趣的可以自行完善一下。

第一种:通过脚本语言,拼接sql语句,采用人工或自动更新数据库。python不完善脚本如下所示:

 #!/usr/bin/env python
# -*- coding: UTF-8 -*- import time
import DbsUtil if __name__ == '__main__': TIME_FORMAT_STYLE='%Y-%m-%d %X' time_start = '1900-01-01 18:43:49'
time_end = '2016-12-21 00:00:00' conn_dict = {"server": "127.0.0.1,1433", "db_name": "pythonMssql", "user_name": "ffp", "pwd": "ffp123"} time_stamp_start = time.mktime(time.strptime(time_start, TIME_FORMAT_STYLE))
time_stamp_end = time.mktime(time.strptime(time_end, TIME_FORMAT_STYLE)) timestamp_step = 60 update_time = time.strftime(TIME_FORMAT_STYLE, time.localtime(time_stamp_start)) row_num_start = 1
row_num_step = 2000
row_num_end = 2000 ms = DbsUtil.MSSQL(host="127.0.0.1",user="ffp",pwd="ffp123",db="pythonMssql")
resList = ms.ExecQuery("SELECT count(*) as counts_up from C_Application")
print resList
CYCLE_MAXa = int(resList[][]) / row_num_step + 1
print CYCLE_MAXa
CYCLE_MAX = int(1874826 / row_num_step + 1) print CYCLE_MAX
CYCLE_MIN = 0 while CYCLE_MIN < CYCLE_MAX:
row_num_start = 1 + CYCLE_MIN * row_num_step
row_num_end = (CYCLE_MIN + 1) * row_num_step
update_time = time.strftime(TIME_FORMAT_STYLE, time.localtime(time_stamp_start + CYCLE_MIN * timestamp_step)) update_sql = "update C_Application set load_start_time = '" + update_time + "' where AppKey in ((select AppKey from (select row_number() over (order by AppKey) as rowId, AppKey from C_Application where Load_Date = '2016-12-21 00:00:00' and load_start_time = '1900-01-01 18:43:49') as t where rowId between " + str(row_num_start) + " and " + str(row_num_end) + "))" print update_sql
CYCLE_MIN = CYCLE_MIN + 1

第二种:通过mssql中的存储过程也可以实现需求。不完善代码如下所示,可自行完善!

 create proc page_update(
@TableName varchar(50), -- 表名
@ReFieldsStr varchar(200), -- 字段名(全部字段为*)
@OrderString varchar(200), -- 排序字段(必须!支持多字段不用加order by)
@WhereString varchar(500) = N'', -- 条件语句(不用加where)
@PageSize int, -- 每页多少条记录
@PageIndex int = 1 , -- 指定当前为第几页
@TotalRecord int output -- 返回执行结果总记录数
)
as
begin
-- 处理开始点和结束点
Declare @StartRecord int;
Declare @EndRecord int;
Declare @TotalCountSql nvarchar(500);
Declare @SqlString nvarchar(2000); SET @StartRecord = (@PageIndex-1)*@PageSize + 1
SET @EndRecord = @StartRecord + @PageSize - 1
-- 总记录数语句
SET @TotalCountSql = N'select @TotalRecord = count(*) from ' + @TableName;
-- 查询语句
SET @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName; IF (@WhereString != '' or @WhereString != null)
BEGIN
SET @TotalCountSql=@TotalCountSql + ' where '+ @WhereString;
SET @SqlString =@SqlString+ ' where '+ @WhereString;
END -- 返回总记录数
EXEC sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord output; -- 执行主语句
SET @SqlString ='select ' + @ReFieldsStr + ' from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' + ltrim(str(@EndRecord));
print @SqlString
END --调用分页存储过程 page_update
--exec page_update 'C_Application','AppKey','AppKey',"Load_Date = '2016-12-21 00:00:00' and load_start_time = '1900-01-01 18:43:49'",2000,1,0;
--exec page_update 'C_Application','*','AppKey',"Load_Date = '2016-12-21 00:00:00' and load_start_time = '1900-01-01 18:43:49'",2000,2,0; --
--declare @totalCount int
--exec page_update 'C_Application','*','AppKey',"Load_Date = '2016-12-21 00:00:00' and load_start_time = '1900-01-01 18:43:49'",1000,2,@totalCount
--select @totalCount as totalCount GO

PS:如上两种仅仅提供了两种实现的思想基础和方法,感兴趣的童鞋,可自行将其完善,需要自行创建测试验证数据。完善后可恢复哦 ^_^

其实,在日常的工作生活中,我们经常会遇到各种各样的问题,需要我们去解决,只是每个人面对问题时的处理方式不同。但是,从根本上来讲,解决问题的方法途径有很多种,关键是你能否快速的利用你已经掌握的知识,结合现有的可用资源,进行灵活的知识变现和资源整合,以更快更好的解决问题。技术仅仅是手段,思想方法才是核心!

Python003-测试辅助示例应用数据库更新语句创建的更多相关文章

  1. 数据库Tsql语句创建--约束--插入数据

    1.创建数据库 use master go if exists(select * from sysdatabases where name='数据库名字') drop database 数据库名字 g ...

  2. Oracle数据库更新时间的SQL语句

    ---Oracle数据库更新时间字段数据时的sql语句---格式化时间插入update t_user u set u.name='pipi',u.modifytime=to_date('2015-10 ...

  3. [转]数据库更新(Update语句)查询

    2011-03-27 10:40:11| 分类: Database |举报|字号 订阅原文出自:http://blog.csdn.net/ylnjust02/archive/2005/12/10/54 ...

  4. Mysql 数据库 操作语句

    mysql 格式语句规范 如何登陆你的数据库? 举例! 如果你的是 编译安装的花 那就得去编译安装后的那个目录中去,我的是安装到/usr/local/mysql 下登陆数据库:cd /usr/loca ...

  5. 数据库-Mysql语句

    Mysql语句 不定时更新 1.数据库相关的语句 /* 数据库操作 */ ------------------ -- 启动MySQL net start mysql -- 接与断开服务器 mysql ...

  6. varchar2_to_blob,应用向数据库更新LOB字段时的超时问题

    将字符串转换为BLOB类型数据,写入服务器. 1,首先利用to_clob函数把varchar2字段转成 clob字段. 2  利用c2b上面函数将clob转成blob. 即: c2b(to_clob( ...

  7. Android数据库更新——上万条数据的插入

    在实际情况下,很可能遇到会向一个表中插入10万条数据,而这样的数据库更新,如果用寻常的方式,在SQLiteOpenHelper.onUpdate()方法中不断的执行SQL语句,那么效率是可想而知的,甚 ...

  8. Java知多少(109)数据库更新

    数据库更新操作包括数据表创建.删除.以及数据表记录的增加.删除.修改等操作.如果利用数据 SQL命令实现,则利用Statement对旬的executeUpdate()方法,执行SQL的update语句 ...

  9. 【MySQL 读书笔记】当我们在执行更新语句的时候我们在做什么

    该篇其实重点涉及两个日志的使用和处理. 一个是 server 层的 binlog 一个是服务器层的 redolog. 首先还是根据主线来介绍当我们在执行更新语句的时候我们在做什么 Redo Log M ...

随机推荐

  1. OpenCV3编程入门-读书笔记3-滤波

    一.领域滤波(卷积) 邻域算子值利用给定像素周围像素的值决定此像素的最终输出.如图左边图像与中间图像卷积得到右边图像.目标图像中绿色的像素由原图像中蓝色标记的像素计算得到. 通用线性邻域滤波是一种常用 ...

  2. 【原创】大叔经验分享(45)kibana添加index pattern卡住 返回403 Forbidden

    kibana添加index pattern卡住,通过浏览器查看请求返回状态为403 Forbidden,返回消息为: {"message":"blocked by: [F ...

  3. iOS UIPrintInteractionController在iPad的 iOS10 和 11上的奇怪bug

    今天在弹出UIPrintInteractionController的时候,在ios10 和11的ipad 上测试,发现一直是protrait 方向弹出,结果就出现如下图的bug: 研究了好长时间,发现 ...

  4. Mysql 常用SQL语句集锦

    基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day from table_name" ...

  5. vue ssr github 项目及其 文章

    https://github.com/Liao123/vue-js-webpack-ssr  这个项目可以完美运行  npm run start 是运行

  6. LightOJ 1349 Aladdin and the Optimal Invitation(中位数)

    题目链接:https://vjudge.net/contest/28079#problem/N 题目大意:给一个mxn的平面,有q个位置,每个位置坐标为(u,v)有w人,求一个点在平面内使得所有人都到 ...

  7. Jmeter性能测试之进阶BeanShell的使用

    BeanShell 最常用的用法 写好Java代码打成jar, 放到目录\lib\ext下面 package com.test; import java.io.File; import java.io ...

  8. golang 如何将imagemagick 和golang 打包到docker 环境中

    公司最近开发了个项目,用到了imagemagick 和golang 环境,在我本地机上开发妥妥的,结果准备部署到线上环境的时候,出现了大坑,尝试了无数次后,最后还是解决了,官方说有问题也不说清楚点,一 ...

  9. sklearn交叉验证3-【老鱼学sklearn】

    在上一个博文中,我们用learning_curve函数来确定应该拥有多少的训练集能够达到效果,就像一个人进行学习时需要做多少题目就能拥有较好的考试成绩了. 本次我们来看下如何调整学习中的参数,类似一个 ...

  10. BZOJ.5092.[Lydsy1711月赛]分割序列(高维前缀和)

    题目链接 \(Description\) \(Solution\) 首先处理\(a_i\)的前缀异或和\(s_i\).那么在对于序列\(a_1,...,a_n\),在\(i\)位置处分开的价值为:\( ...