如何让MySQL存储TIMESTAMP但返回可识别时区的datetime对象

时间:2019-06-27 16:04:39

标签: mysql datetime sqlalchemy

我正在尝试在记录中保留deleted_at列。在撰写本文时,我使用MySQL和最新的sqlalchemy。由于历史原因,我想继续使用MySQL的TIMESTAMP列。

我想在我的整个代码库中使用时区感知日期时间。数据库中的所有内容都存储为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)

代替(用{{1}代替TimezoneAwareTimestamp):

TIMESTAMP

如何使定制类型尊重deleted_at` timestamp(6) NULL DEFAULT NULL server_onupdate

谢谢

查尔斯

0 个答案:

没有答案