Определение таблицы с sqlalchemy с меткой времени mysql unix - PullRequest
3 голосов
/ 18 апреля 2009

Справочная информация, есть несколько способов сохранить даты в MySQ.

  1. в виде строки, например "09/09/2009".
  2. В качестве целого числа, использующего функцию UNIX_TIMESTAMP (), это, предположительно, традиционное представление времени в Unix (вы знаете секунды, начиная с эпохи плюс / минус високосных секунд).
  3. Как MySQL TIMESTAMP, специфический для MySQL тип данных не совпадает с метками времени unix.
  4. В качестве поля MySQL Date - другой специфический для MySQL тип данных.

    Очень важно не путать случай 2 с делом 3 (или делом 4). У меня есть существующая таблица с целочисленным полем даты (случай 2), как я могу определить ее в sqlalchemy таким образом, чтобы у меня не было доступа к функции mysql «FROM_UNIXTIME»?

    Для записи, просто используя sqlalchemy.types.DateTime и надеясь, что он делает правильно, когда обнаруживает, что целочисленный столбец не работает, он работает для полей отметки времени и поля даты.

Ответы [ 2 ]

6 голосов
/ 15 мая 2009

Я думаю, что есть пара проблем с декоратором типов, который вы показали.

  1. impl должно быть sqlalchemy.types.Integer вместо DateTime.
  2. Декоратор должен разрешать обнуляемые столбцы.

Вот что я имею в виду:


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))
2 голосов
/ 18 апреля 2009

Так что да, этот подход работает. И в итоге я ответил на свой вопрос: /, надеюсь, кто-нибудь найдет это полезным.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...