Могут ли объекты DateTime SQLAlchemy быть только наивными? - PullRequest
24 голосов
/ 27 марта 2010

Я работаю с SQLAlchemy, и я еще не уверен, какую базу данных я буду использовать под ним, поэтому я хочу оставаться настолько независимым от БД, насколько это возможно. Как я могу хранить объект datetime с учетом часового пояса в БД, не привязываясь к определенной базе данных? Прямо сейчас я проверяю время UTC до того, как я сохраню их в БД, и конвертирую в локализованное время отображения, но это выглядит не элегантно и хрупко. Существует ли не зависящий от БД способ вывести дату-время с учетом часового пояса из SQLAlchemy вместо извлечения наивных объектов времени-данных из БД?

1 Ответ

42 голосов
/ 27 марта 2010

Существует параметр timezone для DateTime времени столбца, поэтому нет проблем с хранением datetime объектов с учетом часового пояса. Однако я нашел удобным преобразовать хранимые datetime в UTC автоматически с помощью декоратора простого типа:

from sqlalchemy import types
from dateutil.tz import tzutc
from datetime import datetime

class UTCDateTime(types.TypeDecorator):

    impl = types.DateTime

    def process_bind_param(self, value, engine):
        if value is not None:
            return value.astimezone(tzutc())

    def process_result_value(self, value, engine):
        if value is not None:
            return datetime(value.year, value.month, value.day,
                            value.hour, value.minute, value.second,
                            value.microsecond, tzinfo=tzutc())

Обратите внимание, что это ведет себя хорошо, когда вы используете naive datetime случайно (то есть это вызовет ValueError).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...