Я работаю с SQLAlchemy, и я еще не уверен, какую базу данных я буду использовать под ней, поэтому я хочу как можно скорее как DB-agnostic. Как я могу хранить объект базы данных datetime, соответствующий часовому поясу, в DB, не привязывая себя к конкретной базе данных? Прямо сейчас, я уверен, что время UTC, прежде чем я храню их в БД и конвертирую в локализованные во время отображения, но это чувствует себя неэлегантным и хрупким. Есть ли DB-агностический способ получить время-время, зависящее от часового пояса, из SQLAlchemy вместо того, чтобы получать наивные объекты данных из базы данных?
Может ли SQLAlchemy объекты DateTime быть наивными?
Ответ 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).