Подтвердить что ты не робот

Может ли SQLAlchemy объекты DateTime быть наивными?

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

4b9b3361

Ответ 1

Существует параметр 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())

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