我有一个SQLAlchemy column_property,用于从一组对象中获取最新的符合条件的DateTime,建模如下:
latest_released_date = column_property(
select(
Movie.release_date).where(
Movie.release_date <= datetime.now(
tz=timezone.utc)).order_by(
Movie.release_date.desc()).limit(
1).correlate_except(
Movie).scalar_subquery())
然而,它似乎没有返回最近的合格DateTime,而是返回null,即使我有一组对象具有合格的DateTime。
我手动创建了日期时间越来越早的对象,并且我会达到column_property开始返回值的点,但是有时日期时间必须有一个过去3天的偏移量,column_property才会发现它。
我确保以UTC时区保存所有日期时间,并且我的数据库和服务器都设置为UTC。
"release_date": "2022-12-16T11:36:46.974253" # doesn't show up as latest_released_date
"release_date": "2022-12-13T02:06:00" # does show up as latest_released_date
# results of checking tz.info, datetime.now() and datetime.utcnow()
"system_timezone": "UTC",
"now": "2022-12-17 02:45:08.911701",
"now_utc": "2022-12-17 02:45:08.911711+00:00"
以前有没有人遇到过这种情况,或者知道为什么会发生/如何修复?
1条答案
按热度按时间hmae6n7t1#
问题确实在于datetime.now()在声明时只被调用一次,因此它总是保存我部署服务器时的值。我通过切换到www.example.com()中内置的SQLAlchemy(func.now而不是column_property中内置的SQLAlchemy)修复了这个问题,现在一切都按预期工作。