sqlalchemy实现时间列自动更新教程


Posted in Python onSeptember 02, 2020

一、使用场景需求

1、在实际项目开发过程中,用户可以操作的数据,我们往往会新增一个字段,来保存用户最后一次修改时间

2、一些系统中,我们需要存储用户最后一次登录时间,来统计用户的活跃度

二、 在sqlalchemy中常规的做法

1、数据模型

import datetime
from uuid import uuid4
from sqlalchemy import Column, Integer, String, DateTime, Boolean
from sqlalchemy_demo.connect import Base
class UserModule(Base):
  """
  创建一个用户的数据模型
  """
  __tablename__ = 'user'

  uuid = Column(String(36), unique=True, nullable=False, default=lambda: str(uuid4()), comment='uuid')
  id = Column(Integer, primary_key=True, autoincrement=True, comment='用户id')
  user_name = Column(String(30), nullable=False, unique=True, comment='用户名')
  password = Column(String(64), nullable=False, comment='用户密码')
  createtime = Column(DateTime, default=datetime.datetime.now, comment='创建时间')
  updatetime = Column(DateTime, default=datetime.datetime.now, comment='修改时间')
  is_lock = Column(Boolean, default=False, nullable=False, comment='是否锁住用户')

2、每次更新数据的时候,需要手动插入时间字段,来确保updatetime这个时间字段才会更新

三、使用自动更新数据

基于上面手动插入时间字段,在开发过程中很不方便,我们需要的是类似django中修改数据,该列会自动更新

1、导包

from uuid import uuid4
from sqlalchemy import Column, Integer, String, DateTime, Boolean, TIMESTAMP, func
from sqlalchemy.orm import relationship

from sqlalchemy_demo.connect import Base

2、定义数据模型

class UserModule(Base):
  """
  创建一个用户的数据模型
  """
  __tablename__ = 'user'

  uuid = Column(String(36), unique=True, nullable=False, default=lambda: str(uuid4()), comment='uuid')
  id = Column(Integer, primary_key=True, autoincrement=True, comment='用户id')
  user_name = Column(String(30), nullable=False, unique=True, comment='用户名')
  password = Column(String(64), nullable=False, comment='用户密码')
  createtime = Column(DateTime, server_default=func.now(), comment='创建时间')
  # onupdate设置自动更改
  updatetime = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment='修改时间')
  is_lock = Column(Boolean, default=False, nullable=False, comment='是否锁住用户')

3、接下来的创建表与增删改查都一样的。

补充知识:Flask-SQLALchemy对表中数据按时间进行统计

例如表的结构如下:

class Status(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  submit_time = db.Column(db.DateTime, default=datetime.now())

其中,Status表接受用户的提交,现在想对用户的提交情况按时间进行统计。例如过去24小时,每小时的提交次数;过去12个月,每个月的提交次数。

python代码实现查询如下:

from datetime import datetime, timedelta
 
NOW = datetime.utcnow()
last_24h_submits_count = []
for h in xrange(1,25):
  count = session.query(Status).filter(Status.submit_time.between(NOW - timedelta(seconds=h*3600-1), NOW - timedelta(hours=h-1))).count()
  last_24h_submits_count.append(count)

以上这篇sqlalchemy实现时间列自动更新教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python进程管理工具supervisor使用实例
Sep 17 Python
跟老齐学Python之集合的关系
Sep 24 Python
python实现SMTP邮件发送功能
Jun 16 Python
Python 高级专用类方法的实例详解
Sep 11 Python
Python通过命令开启http.server服务器的方法
Nov 04 Python
详解Python3.6安装psutil模块和功能简介
May 30 Python
python实现事件驱动
Nov 21 Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 Python
django ModelForm修改显示缩略图 imagefield类型的实例
Jul 28 Python
Django高并发负载均衡实现原理详解
Apr 04 Python
pytorch查看模型weight与grad方式
Jun 24 Python
python中xlrd模块的使用详解
Feb 01 Python
解决Python 函数声明先后顺序出现的问题
Sep 02 #Python
解决Python3.8运行tornado项目报NotImplementedError错误
Sep 02 #Python
详解python with 上下文管理器
Sep 02 #Python
Python 的 __str__ 和 __repr__ 方法对比
Sep 02 #Python
Python datetime 如何处理时区信息
Sep 02 #Python
浅析python中的del用法
Sep 02 #Python
浅析NumPy 切片和索引
Sep 02 #Python
You might like
php上的memcache和memcached两个pecl库
2010/03/29 PHP
Admin generator, filters and I18n
2011/10/06 PHP
PHP的拦截器实例分析
2014/11/03 PHP
php实现两个数组相加的方法
2015/02/17 PHP
教你在PHPStorm中配置Xdebug
2015/07/27 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
Python实现简单状态框架的方法
2015/03/19 Python
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
python实现图片文件批量重命名
2020/03/23 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
Python实战购物车项目的实现参考
2019/02/20 Python
利用pandas将非数值数据转换成数值的方式
2019/12/18 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
python实现ip地址的包含关系判断
2020/02/07 Python
解决python打开https出现certificate verify failed的问题
2020/09/03 Python
CSS3实现头像旋转效果
2017/03/13 HTML / CSS
Allsole美国/加拿大:英国一家专门出售品牌鞋子的网站
2018/10/21 全球购物
医药专业推荐信
2013/11/15 职场文书
医院领导班子四风问题对照检查材料
2014/10/26 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
学生逃课检讨书
2015/02/17 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python