我正在尝试在记录中保留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
?
谢谢
查尔斯