Defining a table with sqlalchemy with a mysql unix timestamp

前端 未结 2 1164
走了就别回头了
走了就别回头了 2021-01-13 14:56

Background, there are several ways to store dates in MySQ.

  1. As a string e.g. \"09/09/2009\".
  2. As integer using the function UNIX_TIMESTAMP() this is sup
相关标签:
2条回答
  • 2021-01-13 14:57

    So yeah, this approach works. And I ended up answering my own question :/, hope somebody finds this useful.

    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)
    
    0 讨论(0)
  • 2021-01-13 15:09

    I think there is a couple of issues with the type decorator you showed.

    1. impl should be sqlalchemy.types.Integer instead of DateTime.
    2. The decorator should allow nullable columns.

    Here's the what I have in mind:

    
    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))
    
    0 讨论(0)
提交回复
热议问题