【发布时间】:2016-12-03 04:41:06
【问题描述】:
我正在尝试向 python/sqlalchemy 脚本添加时区支持。我研究过时区并使用 pytz。我知道我应该尽可能多地使用 UTC,并且只显示当地时间。由于应用程序的性质,这非常容易。
一切正常,除了当我插入 UTC 数据时,它会在进入数据库之前以某种方式转换为本地时间 (BST),我完全不知道为什么会发生这种情况以及如何避免它。
我的表(postgres)定义如下(仅相关部分):
fpp=> \d foo;
Table "public.foo"
Column | Type | Modifiers
-----------+-----------------------------+-------------------------------------------------------------
x | integer |
y | integer |
when_utc | timestamp without time zone |
我在插入时调试了 sqlalchemy。这就是发生的事情:
2016-07-28 17:16:27,896 INFO sqlalchemy.engine.base.Engine INSERT INTO
foo (x, y, "when_utc") VALUES (%(x)s, %(y)s, %(when_utc)s) RETURNING fb_foo.id
2016-07-28 17:16:27,896 INFO sqlalchemy.engine.base.Engine {
'when_utc': datetime.datetime(2016, 7, 11, 23, 0, tzinfo=<UTC>), 'y': 0, 'x': 0}
因此它插入 UTC 11/7/2016 23:00:00。当我在命令行 psql 中查询它时,我发现:
fpp=> select x,y,when_utc from foo;
x | y | when_utc
---+---+---------------------
0 | 0 | 2016-07-12 00:00:00
(1 row)
发生了什么事?我坚信没有什么能改变两者之间的领域。它似乎只是将 DST 时间添加到我的数据库条目中。为什么?我怎样才能避免这种情况?
R
【问题讨论】:
-
我在 postgresql.conf 中找到了将时区从 GB 更改为 UTC 并重新创建数据库的解决方法。它现在有效,但这不是避免强制转换的唯一方法。
-
您可以在 SQLAlchemy 中更改 PostgreSQL 连接的时区,而无需更改 postgresql.conf。见this answer。
标签: python postgresql datetime sqlalchemy timezone