Я пытаюсь добавить столбец 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
?
Спасибо
Чарльз