¿Pueden los objetos de SQLAlchemy DateTime solo ser ingenuos?

Estoy trabajando con SQLAlchemy, y todavía no estoy seguro de qué base de datos usaré debajo de ella, por lo que quiero seguir siendo tan independiente de la base de datos 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 que se convierta en localizados en el momento de la visualización, pero eso se siente poco elegante y quebradizo. ¿Existe una forma de agnóstico de DB para obtener una fecha y hora de SQLAlchemy con reconocimiento de zona horaria 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 tengan en 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).