SQLAlchemy Как загрузить даты с часовым поясом = UTC (даты, сохраненные без часовой пояс)
У меня есть модель с столбцом даты, определяемая как:
created_on = db.Column(db.DateTime, default=db.func.now(), nullable=False)
Даты начинаются с tz_info = None, что верно, поскольку даты хранятся
без информации о часовом поясе.
Если я печатаю дату:
print(my_object.created_on.isoformat())
Я получаю этот формат
2014-04-26T17:46:27.353936
Я хотел бы иметь индикатор часовой пояс UTC, например:
2014-04-26T17:46:27.353936Z
Есть ли способ определить это поведение в конфигурации схемы?
SQLAlchemy имеет, timezone = Boolean
sqlalchemy.types.DateTime(часовой пояс = False)
так как я хочу, чтобы хранилище было без часовой пояс.
Ответы
Ответ 1
Вам нужен пользовательский тип данных, описанный здесь: http://docs.sqlalchemy.org/en/rel_0_9/core/types.html#custom-types
В частности, что-то вроде этого:
import pytz # from PyPI
class AwareDateTime(db.TypeDecorator):
'''Results returned as aware datetimes, not naive ones.
'''
impl = db.DateTime
def process_result_value(self, value, dialect):
return value.replace(tzinfo=pytz.utc)
Затем просто сделайте столбец следующим образом:
created_on = db.Column(AwareDateTime, default=db.func.now(), nullable=False)
Ответ 2
Я бы рекомендовал использовать тип стрелки.
from datetime import datetime
from sqlalchemy_utils import ArrowType
import arrow
class Article(Base):
__tablename__ = 'article'
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.Unicode(255))
created_at = sa.Column(ArrowType)
article = Article(created_at=arrow.utcnow())
Ответ 3
SQLAlchemy-UTC кажется еще одним приемлемым вариантом.