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 连接各类主流数据库的实例代码
Jan 30 Python
基于python log取对数详解
Jun 08 Python
python numpy 显示图像阵列的实例
Jul 02 Python
Python实现的多叉树寻找最短路径算法示例
Jul 30 Python
python单例模式实例解析
Aug 28 Python
详解python做UI界面的方法
Feb 27 Python
pytorch 修改预训练model实例
Jan 18 Python
selenium 多窗口切换的实现(windows)
Jan 18 Python
python3 xpath和requests应用详解
Mar 06 Python
Python实现一个优先级队列的方法
Jul 31 Python
Python基于pyjnius库实现访问java类
Jul 31 Python
Python xlwings插入Excel图片的实现方法
Feb 26 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 SPL标准库之接口(Interface)详解
2015/05/11 PHP
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
2013/01/24 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
2015/06/10 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
在axios中使用params传参的时候传入数组的方法
2018/09/25 Javascript
详解几十行代码实现一个vue的状态管理
2019/01/28 Javascript
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
Python3.x和Python2.x的区别介绍
2013/02/12 Python
Python序列操作之进阶篇
2016/12/08 Python
简单实现python收发邮件功能
2018/01/05 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
Python通用循环的构造方法实例分析
2018/12/19 Python
如何查看Django ORM执行的SQL语句的实现
2020/04/20 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
英语专业毕业个人求职自荐信
2013/09/21 职场文书
会计实习生工作总结的自我评价
2013/10/07 职场文书
马智宇结婚主持词
2014/04/01 职场文书
单位承诺书格式
2014/05/21 职场文书
三八节活动简报
2015/07/20 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL