SQLAlchemy的保存之前转换UTC日期时间为当地时间

问题描述:

我有以下情况: - Postgres后端与现场SQLAlchemy的保存之前转换UTC日期时间为当地时间

timestamp without time zone 
  • 权之前保存的时间值,它是这样的:2014年9月29日06:00:00 + 00:00
  • 我然后从数据库加载相同的行和值是:2014年9月29日09:00:00

所以在数据库中存储的日期不再是上午6点,而是上午9点 - 它在我当地的时区中进行了转换。

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

谢谢。

编辑

@ univerio的答复所以之后我试过的东西:我做

.replace(tzinfo = None) 

移除了日期时间tzinfo而现在的日期是正确保存 - 它不调整它到当地时间。我不太明白,为什么现在这个问题会留下来,以防有人解释。

谢谢。

+2

回复您的编辑:看来,与时区信息时间戳将获得其转化成连接的时区,当PostgreSQL存储为'timestamp timestamp'时。通过使你的'datetime's天真,你告诉PostgreSQL存储时间戳。如果你对天真的日期时间没有问题,这是一个好的解决方案。就个人而言,我认为通过始终使用明确的'datetime' /'timestamp'并始终使用UTC来避免这些问题会更好。 – univerio 2014-10-01 23:49:30

我怀疑发生的事情是,您正在存储知识datetime s正确,但由于该列是WITHOUT TIME ZONE而没有用时区读取它。每个PostgreSQL连接都有一个默认为系统时区的关联时区,因此当您检索某个特定的TIMESTAMP时,它会在系统时区中作为初始的datetime返回。出于这个原因,我总是建议存储TIMESTAMP WITH TIME ZONE

如果你想改变的SQLAlchemy为UTC连接的时区,请执行下列操作当您创建引擎:

engine = create_engine("...", connect_args={"options": "-c timezone=utc"}) 

这应该让你读值恢复为UTC天真datetime

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

  1. 的SQLAlchemy的文档有关connect_args,使您可以直接参数传递给DBAPI connect()
  2. connect的psycopg2文档,它告诉你关于额外的参数你可以传递给LIBPQ
  3. options参数,使您可以通过命令行选项Libpq的
  4. 的PostgreSQL文档连接有关-c命令 - 当libpq的文档行开关,使您可以修改配置设置
  5. 最后,关于timezone客户端设置的PostgreSQL客户端的文档,你可以设置
+0

经过几个小时寻找一种使用UTC作为默认连接的方式,我找到了您的解决方案。谢谢!很有用。你从哪里学到的?我无法在SQLAlchemy文档中找到它。 – Peter 2014-09-30 11:54:57

+0

@Peter我的回复太长,无法评论;请参阅我的答案中的编辑。 – univerio 2014-09-30 17:59:12

+0

这似乎是我正在寻找的。但是在我的项目中,我们使用engine_from_config方法来创建引擎。我不确定是否可以将connect_args参数也添加到engine_from_config函数中?这在文档中没有直接解释。 – 2014-11-12 17:17:58