Definición de una tabla con sqlalchemy con una marca de tiempo de mysql unix

De fondo, hay varias formas de almacenar fechas en MySQ.

  1. Como una cadena, por ejemplo, “09/09/2009”.
  2. Como entero utilizando la función UNIX_TIMESTAMP (), esta es supuestamente la representación tradicional de tiempo de Unix (usted sabe segundos desde la época más / menos segundos de salto).
  3. Como un TIMESTAMP de MySQL, un tipo de datos específico de mysql no es el mismo que las marcas de tiempo de Unix.
  4. Como un campo de fecha de MySQL, otro tipo de datos específico de mysql.

    Es muy importante no confundir el caso 2 con el caso 3 (o caso 4). Tengo una tabla existente con un campo de fecha entero (caso 2) ¿Cómo puedo definirlo en sqlalchemy de una manera que no tenga que acceder a la función “FROM_UNIXTIME” de mysql?

    Para el registro, solo usando sqlalchemy.types.DateTime y esperando que haga lo correcto cuando detecta que una columna de enteros no funciona, funciona para los campos de fecha y hora.

Creo que hay un par de problemas con el decorador de tipo que mostraste.

  1. impl debe ser sqlalchemy.types.Integer lugar de DateTime .
  2. El decorador debe permitir columnas anulables.

Aquí está lo que tengo en mente:

 import datetime, time from sqlalchemy.types import TypeDecorator, DateTime, Integer class IntegerDateTime(TypeDecorator): """a type that decorates DateTime, converts to unix time on the way in and to datetime.datetime objects on the way out.""" impl = Integer # In schema, you want these datetimes to # be stored as integers. def process_bind_param(self, value, _): """Assumes a datetime.datetime""" if value is None: return None # support nullability elif isinstance(value, datetime.datetime): return int(time.mktime(value.timetuple())) raise ValueError("Can operate only on datetime values. " "Offending value type: {0}".format(type(value).__name__)) def process_result_value(self, value, _): if value is not None: # support nullability return datetime.datetime.fromtimestamp(float(value)) 

Así que sí, este enfoque funciona. Y terminé respondiendo a mi propia pregunta: /, espero que alguien encuentre esto útil.

 import datetime, time from sqlalchemy.types import TypeDecorator, DateTime class IntegerDateTime(TypeDecorator): """a type that decorates DateTime, converts to unix time on the way in and to datetime.datetime objects on the way out.""" impl = DateTime def process_bind_param(self, value, engine): """Assumes a datetime.datetime""" assert isinstance(value, datetime.datetime) return int(time.mktime(value.timetuple())) def process_result_value(self, value, engine): return datetime.datetime.fromtimestamp(float(value)) def copy(self): return IntegerDateTime(timezone=self.timezone)