【问题标题】:Sqlalchemy, postgres datetime without timezoneSqlalchemy,没有时区的postgres日期时间
【发布时间】: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


【解决方案1】:

问题是您的列类型是timestamp without time zone,而应该是timestamp with time zone。这可以在声明列时使用DateTime(timezone=True) 在 SqlAlchemy 中实现。不幸的是,默认值为 False...有关更多信息,请参阅文档https://docs.sqlalchemy.org/en/13/core/type_basics.html#sqlalchemy.types.DateTime

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-05
    • 2013-10-04
    • 1970-01-01
    • 2019-07-14
    • 2021-11-22
    • 2022-08-21
    • 1970-01-01
    • 2020-07-24
    相关资源
    最近更新 更多