tutorial query many create binds python datetime sqlalchemy

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).