需求:
Mysql用户信息表,每天进行一次清理,只保留15天内的用户数据
1、表结构
class UserInfo(db.Model):
__tablename__ = 'user_info'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(32), index=True)
id_card = db.Column(db.String(18), index=True)
create_time = db.Column(db.DateTime, default=datetime.datetime.now)
2、开启事件调度
SET GLOBAL event_scheduler = 1;
上面的命令在mysql服务重启时会失效,如果想永久生效可以在配置my.cnf文件中加上 event_scheduler = 1
3、查看是否开启事件调度
SHOW VARIABLES LIKE 'event_scheduler';
4、创建每天删除15天前数据
CREATE EVENT `del_tbl_expired_data`
ON SCHEDULE EVERY 1 DAY STARTS '2019-05-30 17:33:43'
ON COMPLETION PRESERVE DISABLE
DO CALL del_data_count (15);
上面代码`这个存储过程,并带上参数
代码说明:
- 上面为整体代码,敲完再写分号
- 第一行create event del_tbl_expired_data是创建名为del_tbl_expired_data的事件,注意此处没有括号
- 第二行是创建周期定时的规则,表示从2019-05-29 17:33:43起每一天执行一次del_tbl_expired_data
- 第三行on completion preserve disable是表示创建后并不开始生效。
- 第四行**do call del_data_count (15)是该event(事件)的操作内容,表示调用我们创建的del_data_count ()**存储过程。
5、创建存储过程
mysql> delimiter $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> CREATE PROCEDURE `del_data_count`(IN `date_inter` INT)
-> BEGIN
-> DELETE FROM UserInfo
-> WHERE
-> (TO_DAYS(NOW( ))-TO_DAYS(create_time)) >= `date_inter`; #注意这里一定要有分号
-> END$$
mysql> delimiter ; #将语句的结束符号恢复为分号
6、查看已有定时事件任务
SHOW EVENTS;
7、事件的开启与关闭
开启某事件:ALTER EVENT del_tbl_expired_data ON COMPLETION PRESERVE ENABLE;
关闭某事件:ALTER EVENT del_tbl_expired_data ON COMPLETION PRESERVE DISABLE;