from datetime import datetime, timezone from typing import Optional from sqlalchemy.engine import Dialect from sqlalchemy.types import TypeDecorator, DateTime class AwareDateTime(TypeDecorator[datetime]): impl = DateTime(timezone=True) cache_ok = True def process_bind_param( self, value: Optional[datetime], dialect: Dialect ) -> Optional[datetime]: if value is not None and value.tzinfo is None: value = value.replace(tzinfo=timezone.utc) return value def process_result_value( self, value: Optional[datetime], dialect: Dialect ) -> Optional[datetime]: if value is not None and value.tzinfo is None: value = value.replace(tzinfo=timezone.utc) return value