SQLAlchemy 的DateTime
类型允许一个timezone=True
参数将一个非天真的日期时间对象保存到数据库中,并按原样返回它。有什么方法可以修改tzinfo
SQLAlchemy 传入的时区,例如,它可能是 UTC?我意识到我可以使用default=datetime.datetime.utcnow
; 然而,这是一个天真的时间,即使我使用timezone=True
它,它也会很乐意接受传递一个天真的基于本地时间的日期时间的人,因为它使本地或 UTC 时间变得不天真,而没有一个基准时区来规范它。我已经尝试(使用pytz)使 datetime 对象不幼稚,但是当我将它保存到数据库时,它又变得幼稚。
请注意 datetime.datetime.utcnow 如何不能很好地工作timezone=True
:
import sqlalchemy as sa
from sqlalchemy.sql import select
import datetime
metadata = sa.MetaData('postgres://user:pass@machine/db')
data_table = sa.Table('data', metadata,
sa.Column('id', sa.types.Integer, primary_key=True),
sa.Column('date', sa.types.DateTime(timezone=True), default=datetime.datetime.utcnow)
)
metadata.create_all()
engine = metadata.bind
conn = engine.connect()
result = conn.execute(data_table.insert().values(id=1))
s = select([data_table])
result = conn.execute(s)
row = result.fetchone()
(1, datetime.datetime(2009, 1, 6, 0, 9, 36, 891887))
row[1].utcoffset()
datetime.timedelta(-1, 64800) # 那是我的本地时间偏移!!
datetime.datetime.now(tz=pytz.timezone("US/Central"))
datetime.timedelta(-1, 64800)
datetime.datetime.now(tz=pytz.timezone("UTC"))
datetime.timedelta(0) #UTC
即使我将其更改为明确使用 UTC:
...
data_table = sa.Table('data', metadata,
sa.Column('id', sa.types.Integer, primary_key=True),
sa.Column('date', sa.types.DateTime(timezone=True), default=datetime.datetime.now(tz=pytz.timezone('UTC')))
)
row[1].utcoffset()
...
datetime.timedelta(-1, 64800) # 它没有使用我明确添加的时区
或者,如果我放弃timezone=True
:
...
data_table = sa.Table('data', metadata,
sa.Column('id', sa.types.Integer, primary_key=True),
sa.Column('date', sa.types.DateTime(), default=datetime.datetime.now(tz=pytz.timezone('UTC')))
)
row[1].utcoffset() is None
...
True # 这次它甚至没有将时区保存到数据库