我正在尝试为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
答案 0 :(得分:0)
问题在于您的列类型应为timestamp without time zone
,而列类型应为timestamp with time zone
。声明列时,可以在SqlAlchemy中使用DateTime(timezone=True)
来实现。不幸的是,默认值为False ...有关更多信息,请参见文档https://docs.sqlalchemy.org/en/13/core/type_basics.html#sqlalchemy.types.DateTime