SqlAlchemy在保存之前将UTC DateTime转换为本地时间

sir*_*cco 10 python datetime sqlalchemy

我有以下情况: - Postgres后端有一个字段

timestamp without time zone
Run Code Online (Sandbox Code Playgroud)
  • 在保存日期时间值之前,它看起来像:2014-09-29 06:00:00 + 00:00
  • 然后我从数据库加载相同的行,值为:2014-09-29 09:00:00

所以在数据库中,存储的日期不再是6AM ..但是9AM - 它在我当地时区转换.

我不明白发生了什么.为什么保存的日期转换为本地?

谢谢.

编辑

所以在@ univerio的回复之后我尝试了一些东西:我从日期时间中删除了tzinfo

.replace(tzinfo = None) 
Run Code Online (Sandbox Code Playgroud)

现在日期保存正确 - 它不会调整到当地时间.我不太明白为什么所以我会暂时保留这个问题以防万一有人解释.

谢谢.

uni*_*rio 25

我怀疑正在发生的是你datetime正确地存储了知识,但是没有用时区读回来因为列是WITHOUT TIME ZONE.每个PostgreSQL连接都有一个默认为系统时区的关联时区,因此当您检索特定时区时,TIMESTAMP它会datetime在系统的时区中以天真的形式返回.出于这个原因,我总是建议存储TIMESTAMP WITH TIME ZONE.

如果要将SQLAlchemy中的连接时区更改为UTC,请在创建引擎时执行以下操作:

engine = create_engine("...", connect_args={"options": "-c timezone=utc"})
Run Code Online (Sandbox Code Playgroud)

这应该让你datetime在UTC中以天真的形式读回值.

编辑:@Peter文档没有说明如何做到这一点; 我不得不阅读几个不同的文档并连接点:

  1. 关于connect_args它的SQLAlchemy文档允许您将参数直接传递给DBAPIconnect()
  2. psycopg2文档打开connect,它告诉您可以传递给libpq的额外参数
  3. 有关该options参数的libpq文档,它允许您在与libpq连接时传递命令行选项
  4. 有关-c命令行开关的PostgreSQL文档,允许您修改配置设置
  5. 最后,PostgreSQL客户端文档有关timezone您可以设置的客户端设置

  • 谢谢。救星。在此之上添加flask-sqlalchemy,需要设置`SQLALCHEMY_ENGINE_OPTIONS = {"connect_args": {"options": "-c timezone=utc"}}`。 (2认同)