You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy中datetime.utcnow()与datetime.now(timezone.utc)失效,date_posted字段值为None的问题求助

SQLAlchemy中datetime.utcnow()与datetime.now(timezone.utc)失效,date_posted字段值为None的问题求助

我之前也遇到过一模一样的问题,别急,咱们来一步步分析解决:

问题原因

你代码里的date_posted字段默认值设置方式有问题:

date_posted = db.Column(db.DateTime, nullable=False, default=datetime.now(timezone.utc))

这里你直接调用了datetime.now(timezone.utc),这行代码会在类定义的时候就执行一次,得到一个固定的时间值,而不是每次创建Post实例时动态生成当前UTC时间。SQLAlchemy的default参数需要接收一个可调用对象(比如函数、lambda表达式),这样在需要生成默认值时才会调用它。

解决方案

有两种靠谱的解决方法,选一个你觉得顺手的就行:

方法一:用lambda表达式包装函数调用

这样每次创建Post实例时,都会执行lambda来获取实时的UTC时间:

from datetime import datetime, timezone
# ...
date_posted = db.Column(db.DateTime, nullable=False, default=lambda: datetime.now(timezone.utc))

方法二:使用SQLAlchemy内置的func.now()

这种方式会利用数据库自身的当前时间函数,更符合ORM的最佳实践,而且不需要手动处理时区(如果数据库配置了UTC时区的话):

from sqlalchemy import func
# ...
date_posted = db.Column(db.DateTime, nullable=False, default=func.now())

验证修改效果

修改后,你再在终端里测试:

>>> from myapp1 import app, db, User, Post 
>>> with app.app_context():
...     post1 = Post(title="title1", content="content1", user_id=1)
...     post1
...
Post('title1', '2024-05-20 12:34:56.789012+00:00')

这次date_posted就会显示正确的当前UTC时间啦~

备注:内容来源于stack exchange,提问作者lumba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:58:00