我已经定义了一个SQLAlchemy表
foo_table = Table('foo', metadata,
Column('id', Integer, primary_key=True),
Column('created_on', DateTime, default=func.now()),
...
)它在Postgres中创建一个表。
CREATE TABLE foo
(
id serial NOT NULL,
created_on timestamp without time zone,
...
)本地时区被正确设置(检查Python的datetime.datetime.now()显示我的本地时间),但是每当我在foo_table中插入一行而没有显式设置created_on时,所用的时间是当前的UTC,而不是我的本地时间(例如“2015-07-2916:38:08.112192”)。
当我尝试手动设置created_on时,这一切都很好,但当将时间留给func.now()分配时间戳时,Postgres或SQLAlchemy似乎正在将时间转换为UTC。
如何才能让SQLAlchemy或Postgres只使用当前的本地时间创建记录?
发布于 2015-07-30 07:23:33
这里的关键部分是列created_on被定义为“没有时区的时间戳”。
在这里的文件中:
http://www.postgresql.org/docs/current/static/datatype-datetime.html
在已被确定为没有时区的时间戳的文字中,PostgreSQL将无声地忽略任何时区指示。也就是说,结果值是从输入值中的日期/时间字段派生出来的,不对时区进行调整。 对于带有时区的时间戳,内部存储的值总是以UTC (通用协调时间,传统上称为格林尼治标准时间,GMT)为单位。指定了显式时区的输入值将使用该时区的适当偏移量转换为UTC。如果输入字符串中没有指定时区,则假定它位于由系统的TimeZone参数指示的时区,并使用时区的偏移量将其转换为UTC。
因此,实际上,您正在丢弃时区信息,只剩下存储的UTC日期。
在SQLAlchemy的情况下,要创建具有“带有时区的时间戳”的列,需要添加以下内容:
DateTime(timezone=True)
根据这里的文件:
basics.html
这应该可以让您保存您想要的时区信息,并检索它。
希望这有助于回答你的问题,让你上路。祝你好运。=)
https://stackoverflow.com/questions/31715078
复制相似问题