通过ORM赋值创建JSONB时如何添加CURRENT_TIMESTAMP
解决方案
你遇到的问题是因为text('CURRENT_TIMESTAMP')是SQLAlchemy的SQL表达式对象,无法被JSON序列化。根据你想要服务器事务时间戳的需求,有两种可行的处理方式:
方式一:让数据库生成并封装时间戳到JSONB
直接通过SQLAlchemy的数据库函数构造包含服务器时间的JSONB对象,这样数据库会在执行SQL时计算CURRENT_TIMESTAMP并封装成JSON结构:
from sqlalchemy import func # 使用jsonb_build_object构造包含服务器时间的JSONB mymodel.data = func.jsonb_build_object('a', func.current_timestamp())
如果是要更新已有JSONB字段的指定键,可以用jsonb_set:
# 更新已有data字段,将a键设为服务器事务时间 mymodel.data = func.jsonb_set(mymodel.data, '{a}', func.to_json(func.current_timestamp()))
方式二:在Python端生成时间并序列化
如果可以接受使用Python端的时间(而非数据库服务器事务时间),直接生成可JSON序列化的时间字符串即可:
from datetime import datetime # 生成UTC时间的ISO格式字符串,可直接被JSON序列化 mymodel.data = {'a': datetime.utcnow().isoformat()}
原方法失败原因
text('CURRENT_TIMESTAMP')是SQLAlchemy用来表示原生SQL片段的对象,不属于Python原生的可JSON序列化类型。当你将其赋值给JSONB字段时,SQLAlchemy会尝试把整个字典序列化为JSON,而该对象无法被JSON编码器处理,因此抛出序列化错误。
内容的提问来源于stack exchange,提问作者nicoqwil
相关产品推荐
相关产品推荐

