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程序语言快速上手教程
Jul 18 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 Python
基于python实现在excel中读取与生成随机数写入excel中
Jan 04 Python
pandas值替换方法
Jul 10 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
Django Sitemap 站点地图的实现方法
Apr 29 Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 Python
pandas中DataFrame修改index、columns名的方法示例
Aug 02 Python
Pytorch之contiguous的用法
Dec 31 Python
Python中import导入不同目录的模块方法详解
Feb 18 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
python和node.js生成当前时间戳的示例
Sep 29 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+javascript的日历控件
2009/11/19 PHP
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
PHP7如何开启Opcode打造强悍性能详解
2018/05/11 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
利用Vue.js指令实现全选功能
2016/09/08 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
Vue.js添加组件操作示例
2018/06/13 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
分享JS表单验证源码(带错误提示及密码等级)
2020/01/05 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
python定向爬取淘宝商品价格
2018/02/27 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
记一次python 内存泄漏问题及解决过程
2018/11/29 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
搭建python django虚拟环境完整步骤详解
2019/07/08 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
Python使用正则表达式实现爬虫数据抽取
2020/08/17 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
入党积极分子培养人意见
2015/06/02 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
Python 中random 库的详细使用
2021/06/03 Python