Тип DateTime
в SQLAlchemy позволяет аргументу 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
...
Правда # это время даже не сохраняло часовой пояс в БД