SQLAlchemy实现时间列自动更新与按时间统计教程

阿澈
阿澈
发布时间:2026-10-14 | 3人浏览过
原创

本文详解如何在SQLAlchemy中实现时间字段的自动更新,通过server_default和onupdate参数避免手动维护updatetime。同时补充Flask-SQLAlchemy中按小时、月份统计提交次数的查询技巧,涵盖数据模型定义与具体Python代码实现。

使用场景需求

一、使用场景需求

在实际项目开发过程中,针对用户可操作的数据,通常建议新增一个字段以记录用户最后一次修改的时间。

部分系统需要存储用户最后一次登录时间,以此作为统计用户活跃度的依据。

SQLAlchemy常规做法

二、在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='是否锁住用户')

每次更新数据时,需要手动插入时间字段,以确保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 相关产品和应用

全部下载

专题列表