You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Python的SQLAlchemy类中读取UNIX时间戳为datetime对象

解决SQLAlchemy读取UNIX时间戳自动转为datetime对象的问题

你当前的__init__方法只在手动创建Data实例时生效,但从数据库查询记录时,SQLAlchemy会直接把数据库里的Float值赋值给字段,不会经过__init__的转换。要实现读取自动转datetime、写入自动转UNIX时间戳的双向处理,得用SQLAlchemy的类型装饰器来做:

from datetime import datetime
from sqlalchemy import Column, Integer, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.types import TypeDecorator

Base = declarative_base()

# 自定义类型:处理UNIX时间戳与datetime对象的双向转换
class UnixTimestamp(TypeDecorator):
    # 指定数据库存储的底层类型为Float
    impl = Float

    # 从数据库读取数据时,把Float时间戳转成datetime对象
    def process_result_value(self, value, dialect):
        if value is not None:
            return datetime.fromtimestamp(value)
        return None

    # 写入数据库时,把datetime对象转成UNIX时间戳
    def process_bind_param(self, value, dialect):
        if isinstance(value, datetime):
            return value.timestamp()
        return value

class Data(Base):
    __tablename__ = 'Data'

    id = Column('id', Integer, primary_key=True)
    # 替换原来的Float类型为自定义的UnixTimestamp
    action_datetime = Column('Time & Date', UnixTimestamp)

    # 调整初始化方法,兼容传入datetime对象或Float时间戳
    def __init__(self, id: int, action_datetime: float | datetime):
        self.id = id
        if isinstance(action_datetime, float):
            self.action_datetime = datetime.fromtimestamp(action_datetime)
        else:
            self.action_datetime = action_datetime

代码说明

  • UnixTimestamp类继承自TypeDecorator,帮你自动处理类型转换:
    • 查询数据库时,process_result_value会自动把Float时间戳转成datetime对象
    • 写入数据库时,process_bind_param会自动把datetime对象转成UNIX时间戳存入
  • 调整后的__init__同时支持传入datetime对象或Float时间戳,不管是手动创建实例还是从数据库读取,action_datetime都会是datetime对象

测试示例

# 查询数据时,action_datetime自动是datetime类型
data = session.query(Data).first()
print(type(data.action_datetime))  # 输出 <class 'datetime.datetime'>

# 手动创建实例,支持两种传入方式
new_data1 = Data(id=2, action_datetime=datetime.now())
new_data2 = Data(id=3, action_datetime=1718000000.0)
session.add_all([new_data1, new_data2])
session.commit()

内容的提问来源于stack exchange,提问作者mraabhijit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:38:10