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
相关产品推荐
相关产品推荐

