python - query - ¿Pueden los objetos SQLAlchemy DateTime solo ser ingenuos?
sqlalchemy relationship (1)
Estoy trabajando con SQLAlchemy, y aún no estoy seguro de qué base de datos usaré debajo de ella, por lo que quiero seguir siendo tan independiente de DB como sea posible. ¿Cómo puedo almacenar un objeto de fecha y hora compatible con la zona horaria en la base de datos sin atarme a una base de datos específica? En este momento, me estoy asegurando de que los tiempos sean UTC antes de almacenarlos en la base de datos, y de convertirlos a localizados en el momento de la visualización, pero eso se siente poco elegante y quebradizo. ¿Hay una forma de agnóstico de base de datos para obtener una hora de datación de la zona horaria fuera de SQLAlchemy en lugar de obtener objetos de datatime ingenuos fuera de la base de datos?
Hay un parámetro de timezone
para el tiempo de la columna DateTime
, por lo que no hay ningún problema con el almacenamiento de objetos de datetime
y datetime
cuenta la zona horaria. Sin embargo, me pareció conveniente convertir el datetime
almacenado a UTC automáticamente con un decorador de tipo simple:
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())
Tenga en cuenta que esto se comporta muy bien cuando usa un datetime
ingenuo por accidente (lo que significa que generará un ValueError).