python 定时修改数据库
当需要定时修改数据库时,一般我们都选择起一个定时进程去改库。如果将这种定时任务写入业务中,写成一个接口呢,定时进程显得有些不太合适?如果需要定时修改100次数据库,常规做法会启动100个进程,虽然这种进程非常轻量级,但还是会感觉不爽。实际上我们可以使用threading.Timer创建相应的线程来执行改库操作,思路也比较简单。
1.传入执行改库操作的时间update_time,用update_time和当前时间相减法,得到距离改库操作还有多少时间time_delay。求两个标准时间格式字符串的时间差可以使用datetime.datetime.strptime()来格式化时间,格式化后的时间可以直接相减法,对结果执行.seconds()就可以转化成秒
2.将改库操作封装成方法update(),然后将update和时间差传入threading.Timer创建的线程,用法为threading.Timer(interval, function, args=[], kwargs={})创建线程实例,interval为延迟执行的时间,单位是秒,然后,start()执行。Timer是非阻塞的,可以创建出多个线程互不影响。
代码如下
#!/usr/bin/env python3
# -*- coding: utf-8 -*- from model import Table
from handler.base_handler import BaseHandler
from threading import Timer
import datetime class TimeHandler(BaseHandler):
def do_action(self):
update_time = "2018-04-07 18:00:00"
ads_id = "test_1"
t_online = datetime.datetime.strptime(update_time, '%Y-%m-%d %H:%M:%S')
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
t_now = datetime.datetime.strptime(now, '%Y-%m-%d %H:%M:%S')
time_delay = (t_online - t_now).seconds
t1 = Timer(time_delay, self.update, (ads_id, ))
t1.start()
self.result = "success"
return def update(self, ads_id):
self.db.dsp.query(Table).filter(Table.ads_id == ads_id).update({Table.is_del: 0})
self.db.dsp.commit()
可以将update_time改为前端传入的参数,就可以在该时间执行改库操作了。当时遇到了一个小坑,就是改库操作没有生效,原因是没加最后一行的commit()。本来改库的commit生效是写在基类BaseHandler重的,但是这里的update()在Timer线程中执行,属于异步操作,需要在线程中执行commit()使改动生效。
这种借助Timer定时执行的方法比传统的定时进程更轻量,也更简单,但是也有着明显的缺点。当服务关闭时,所有的定时线程也就随着主进程一起销毁,所有线程都能成功执行的前提条件是服务必须稳定,不能重启。如果想要重启服务,就需要想办法将未完成的任务落盘(比如写到数据库中),然后启动服务时读取之前未完成的任务重新创建定时线程。
python 定时修改数据库的更多相关文章
- 使用Python批量修改数据库执行Sql文件
由于上篇文章中批量修改了文件,有的时候数据库也需要批量修改一下,之前的做法是使用宝塔的phpMyAdmin导出一个已经修改好了的sql文件,然后依次去其他数据库里导入,效率不说极低,也算低了,且都是些 ...
- Quartz动态修改数据库cronExpression(无须重启服务器即可更改定时时间)
quartz通过动态设置配置文件确实可以实现与数据库的同步,但现实开发上线后我们基本是不会对配置文件等进行变动,因为重启一次服务器所需的成本太多. 这时,就需要我们仅仅修改数据库就能实现动态的更新定时 ...
- 本地SQL数据库执行作业定时修改其他数据库内容
--exec sp_addlinkedserver 'xkp', ' ', 'SQLOLEDB', '192.168.66.66' 定义链接--exec sp_addlinkedsrvlogin ' ...
- Python定时框架 Apscheduler 详解【转】
内容来自网络: https://www.cnblogs.com/luxiaojun/p/6567132.html 在平常的工作中几乎有一半的功能模块都需要定时任务来推动,例如项目中有一个定时统计程序, ...
- Python操作Mysql数据库时SQL语句的格式问题
一.概述 近日使用Python对Mysql数据库进行操作,遇到SQL语句死活出问题的情况.由于最初没有将异常打印出来,一直不知道原因.随后,将异常打印出来之后,通过异常信息,对代码进行修改.最终,成功 ...
- python使用mysql数据库
一,安装mysql 如果是windows 用户,mysql 的安装非常简单,直接下载安装文件,双击安装文件一步一步进行操作即可. Linux 下的安装可能会更加简单,除了下载安装包进行安装外,一般的l ...
- 定时取数据库的schema,并推送到git服务器
写了个脚本,定时去数据库取schema,并推送到公司的git里. #daily_schema.py #/usr/bin/env python import os import datetime,tim ...
- linux下mysql定时备份数据库
linux下mysql定时备份数据库 (2010-10-21 12:40:17) 转载▼ 标签: 杂谈 一.用命令实现备份 首页进入mysql的bin目录 1.备份数据#mysqldump -uu ...
- Python使用MySQL数据库的方法以及一个实例
使用环境:Windows+python3.4+MySQL5.5+Navicat 一.创建连接 1.准备工作,想要使用Python操作MySQL,首先需要安装MySQL-Python的包,在Python ...
随机推荐
- LeetCode--No.002 Add Two Numbers
Add Two Numbers Total Accepted: 160702 Total Submissions: 664770 Difficulty: Medium You are given tw ...
- IOS返回go(-1)
IOS8和9,在用go(-1)返回的时候,会同时加载js.可能会造成js加载顺序出错,或者值被覆盖的情况,我们可以用setTimeout(function(){XXX代码},100);延时加载.
- SpringBoot的幕后推手...
一.背景 这两年随着微服务的盛行,SpringBoot框架水到渠成的得到了高曝光,作为程序猿的我们,现在要是不知道一点SpringBoot相关的东西,貌似出去找工作都会被深深地鄙视,不过在我们开始 ...
- 从零开始学 Web 之 JS 高级(二)原型链,原型的继承
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- 大牛是怎么思考设计MySQL优化方案
在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已. 1.优化的哲学 注:优化有风险,涉足需谨 ...
- 通过spring抽象路由数据源+MyBatis拦截器实现数据库自动读写分离
前言 之前使用的读写分离的方案是在mybatis中配置两个数据源,然后生成两个不同的SqlSessionTemplate然后手动去识别执行sql语句是操作主库还是从库.如下图所示: 好处是,你可以人为 ...
- S3C2440 DMA 驱动示例
将 DMA 抽象为一个字符设备,在初始化函数中调用 void *dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t * ...
- js------科学计数法转换为正常小数
// toD.js文件export default (val) => { const e = String(val) let rex = /^([0-9])\.?([0-9]*)e-([0-9] ...
- js------数组随机排序和去重
let arr = ['g', 'b', 'c', 'd', 'e', 'a', 'g', 'b', 'c']; // 数组随机排序(原数组被修改)Array.prototype.randomSort ...
- Django之破解数独
数独是一项快乐的益智游戏,起源于18世纪瑞士的一种数学游戏.解答者需要运用纸.笔进行演算,需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫(3*3)内的 ...