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使用paramiko模块实现ssh远程登陆上传文件并执行
Jan 27 Python
python实现的简单窗口倒计时界面实例
May 05 Python
Python发送以整个文件夹的内容为附件的邮件的教程
May 06 Python
利用Python代码实现数据可视化的5种方法详解
Mar 25 Python
判断python字典中key是否存在的两种方法
Aug 10 Python
Python使用matplotlib绘制三维图形示例
Aug 25 Python
举例讲解Python常用模块
Mar 08 Python
利用Python半自动化生成Nessus报告的方法
Mar 19 Python
Python定时任务随机时间执行的实现方法
Aug 14 Python
python让函数不返回结果的方法
Jun 22 Python
python怎么删除缓存文件
Jul 19 Python
Python中Yield的基本用法
Oct 18 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作为网站开发语言的原因分享
2012/01/03 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
2013/06/21 PHP
PHP实现发送微博消息功能完整示例
2019/12/04 PHP
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
利用js动态添加删除table行的示例代码
2013/12/16 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
extjs 时间范围选择自动判断的实现代码
2014/06/24 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
JS+CSS实现六级网站导航主菜单效果
2015/09/28 Javascript
jquery实现点击其他区域时隐藏下拉div和遮罩层的方法
2015/12/23 Javascript
常用的JQuery函数及功能小结
2016/03/24 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
2016/11/29 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
React如何避免重渲染
2018/04/10 Javascript
Python入门之modf()方法的使用
2015/05/15 Python
Python编程之属性和方法实例详解
2015/05/19 Python
python opencv之分水岭算法示例
2018/02/24 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
python银行系统实现源码
2019/10/25 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
Linden Leaves官网:新西兰纯净护肤品
2020/12/20 全球购物
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
社区工作者先进事迹
2014/01/18 职场文书
母亲七十大寿答谢词
2014/01/18 职场文书
乡镇干部先进事迹材料
2014/02/03 职场文书
四下基层实施方案
2014/03/28 职场文书
借款协议书
2014/09/16 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
中小企业员工手册范本
2015/05/14 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL