在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
相关产品推荐
相关产品推荐

