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 кажется еще одним приемлемым вариантом.