Sqlalchemy,postgres datetime没有时区

时间:2016-07-28 16:45:29

标签: python postgresql datetime sqlalchemy timezone

我正在尝试为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

1 个答案:

答案 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