flask_sqlalchemy时间缓存导致datetime.now()时间不变问题

问题是这样的,项目在本地没什么问题,但是部署到服务器过一阵子发现,这个时间会在某一刻定死不变。

重启uwsgi后,发现第一条数据更新到了目前最新时间,过了一会儿再次发送也变了时间,但是再过几分钟再发就会变成和上次一样的时间。

我的基类模型是这样写的

python 复制代码
class BaseModel(db.Model):
    """ 基类模型 """
    __abstract__ = True
    id = db.Column(db.Integer, primary_key=True, comment='id主键')
    add_time = db.Column(db.DateTime, default=datetime.now(), comment='创建时间')
    upd_time = db.Column(db.DateTime, default=datetime.now(), onupdate=datetime.now(), comment='更新时间')

从发送到保存都检查了一遍,没有发现什么问题,且检查了debian的时区和date是没问题的,因为python的datetime就是基于系统时间而言去生成的。

解决方案是需要将时间函数改成函数引用的方式,将now的函数地址传递。这也每次sqlalchemy生成执行sql的时候,将会直接执行函数引用,将 datetime.now当作参数进行传递,并执行。

最终将 datetime.now()改成datetime.now搞定

python 复制代码
class BaseModel(db.Model):
    """ 基类模型 """
    __abstract__ = True
    id = db.Column(db.Integer, primary_key=True, comment='id主键')
    add_time = db.Column(db.DateTime, default=datetime.now, comment='创建时间')
    upd_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')

源码分析:


Columndefault参数通常接收一个默认的固定值以及一个可调用对象

处理列的默认值的关键类,这里的 __new__ 构造方法是决定 ColumnDefault 类实例化行为关键代码。

  • 如果 arg 是一个可调用对象(callable),则创建 CallableColumnDefault 类的实例。
  • 如果 arg 是 ClauseElement 的实例,创建 ColumnElementColumnDefault 类的实例。
  • 如果 arg 是非 None 的其他类型,创建 ScalarElementColumnDefault 类的实例。

如果你传入的是 datetime.now则会走 CallableColumnDefault,否则 now()的话就会视为常量而走 ScalarElementColumnDefault

当你将 datetime.now 作为 default 参数传递时(不带括号),它被视为一个可调用对象,因此会创建 CallableColumnDefault 的实例。这意味着每次需要默认值时,datetime.now 都会被调用,生成一个新的当前时间戳。

而当你传递 datetime.now() 时(带括号),它立即执行并返回一个具体的 datetime 对象。然而,这种用法通常不是期望的,因为它不会在每次插入操作时提供一个新的时间,而是使用了定义时的时间。

在实际运行时,SQLAlchemy 会根据 ColumnDefault 实例的类型来确定如何处理默认值

可以得到结论是在SQLAlchemy中,关于时间创建时自动生成的逻辑,是得用 datetime.now作为可调用对象传递过去,而不是常量。但是关于我在重启服务后,并没有直接定死,而是发了两条可以获得两个时间节点的数据后,再定死的逻辑没有查到具体的位置。按照分析如果我最初传入的是 now()则在第一次是 16:01 后再次发也是 16:01。但这块是在我下一次发送时成了 16:12 而后就再也不会去调用函数获取时间了,永远定死。这块可能的因素太多了。搞定问题暂时Run着,有分析过的老哥交流一下,peace

相关推荐
小柯南敲键盘21 分钟前
跨马翻译:批量图片与视频字幕翻译,支持智能抠图
大数据·人工智能·python·音视频
再渊1 小时前
基因归因到底怎么计算的?
python·深度学习·机器学习
E_ICEBLUE1 小时前
Python 拆分 Excel 文件:使用 Spire.XLS 实现按工作表、行、列和条件拆分
python·excel
aiqianji1 小时前
有哪些稳定的AI短篇小说写作软件可以推荐?
人工智能·python
Y3815326621 小时前
3 种 SERP 数据处理方案对比:流式 / 批处理 / 缓存
java·spring·缓存
Database_Cool_1 小时前
LLM 应用怎么省 Token、加速响应——阿里云 Tair 语义缓存实战
阿里云·缓存·云计算
Albart5751 小时前
2026年Python入门路线图:从零到实战的30天逐日详解(三)
学习·flask·#python30 天入门·python 实战教程·pytest 单元测试·python 虚拟环境·logging 日志
三言老师1 小时前
CentOS7.9:Redis 数据持久化结构化实战教程
数据库·redis·缓存
Ulyanov2 小时前
Python雷达电子对抗仿真引擎(一):打破单体瓶颈,构建微服务与ECS架构的顶层设计
开发语言·python·微服务·云原生·架构·雷达电子对抗
蓝创工坊Blue Foundry2 小时前
批量提取图片中的数字:怎样整理成一张可核对的 Excel
python·ai·ocr·excel·paddlepaddle