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而现在的日期是正确保存 - 它不调整它到当地时间。我不太明白,为什么现在这个问题会留下来,以防有人解释。
谢谢。
我怀疑发生的事情是,您正在存储知识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文档并没有说明如何做到这一点;我不得不读几个不同的文档和连接点:
- 的SQLAlchemy的文档有关
connect_args
,使您可以直接参数传递给DBAPIconnect()
- 上
connect
的psycopg2文档,它告诉你关于额外的参数你可以传递给LIBPQ - 在
options
参数,使您可以通过命令行选项Libpq的 - 的PostgreSQL文档连接有关
-c
命令 - 当libpq的文档行开关,使您可以修改配置设置 - 最后,关于
timezone
客户端设置的PostgreSQL客户端的文档,你可以设置
经过几个小时寻找一种使用UTC作为默认连接的方式,我找到了您的解决方案。谢谢!很有用。你从哪里学到的?我无法在SQLAlchemy文档中找到它。 – Peter 2014-09-30 11:54:57
@Peter我的回复太长,无法评论;请参阅我的答案中的编辑。 – univerio 2014-09-30 17:59:12
这似乎是我正在寻找的。但是在我的项目中,我们使用engine_from_config方法来创建引擎。我不确定是否可以将connect_args参数也添加到engine_from_config函数中?这在文档中没有直接解释。 – 2014-11-12 17:17:58
回复您的编辑:看来,与时区信息时间戳将获得其转化成连接的时区,当PostgreSQL存储为'timestamp timestamp'时。通过使你的'datetime's天真,你告诉PostgreSQL存储时间戳。如果你对天真的日期时间没有问题,这是一个好的解决方案。就个人而言,我认为通过始终使用明确的'datetime' /'timestamp'并始终使用UTC来避免这些问题会更好。 – univerio 2014-10-01 23:49:30