Как заставить MySQL хранить TIMESTAMP, но возвращать объекты datetime с учетом часового пояса - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь добавить столбец deleted_at в свои записи. Я использую MySQL и последние sqlalchemy на момент написания статьи. По историческим причинам я хочу продолжать использовать столбцы TIMESTAMP в MySQL.

Я хотел бы использовать дату и время с учетом часового пояса в моей кодовой базе. Все в моей БД хранится как UTC, поэтому мне не нужно хранить часовой пояс. Я просто хочу убедиться, что datetime возвращается как UTC-datetime.

import pytz
from sqlalchemy import Column, text, types
from sqlalchemy.dialects.mysql import TIMESTAMP as M_TIMESTAMP


# Fractional second precision
FSP = 6
TIMESTAMP = M_TIMESTAMP(fsp=FSP)
CURRENT_TIMESTAMP = text("CURRENT_TIMESTAMP(%d)" % FSP)


class TimezoneAwareTimestamp(types.TypeDecorator):
    """Ensure tz-aware timestamp are returned."""


    impl = TIMESTAMP


    def process_result_value(self, value, dialect):
        if not value:
            return None
        return value.replace(tzinfo=pytz.UTC)


def DeletedAt():
    return Column("deleted_at", TimezoneAwareTimestamp, server_onupdate=text("0"),
                  nullable=True)

Это довольно естественное решение, которое я придумал. Проблема: TimezoneAwareTimestamp не учитывает атрибут server_onupdate при создании. Таблица, созданная с этим столбцом DeletedAt, будет отображаться как:

deleted_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)

вместо (замена TimezoneAwareTimestamp на TIMESTAMP):

deleted_at` timestamp(6) NULL DEFAULT NULL

Как я могу иметь пользовательский тип уважения server_onupdate и nullable?

Спасибо

Чарльз

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...