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

PostgreSQL作为Celery结果后端存储任务结果为字节格式是否正常?

这个现象符合Celery的默认设计,不属于代码或配置遗漏问题。
Celery默认使用pickle协议序列化任务结果,PostgreSQL作为数据库后端时,会将序列化后的二进制数据存储为bytea类型字段,你直接查询数据库看到的十六进制格式/内存对象就是pickle序列化后的二进制内容。


方法1:直接反序列化现有二进制结果

如果不修改现有配置,你只需要将查询到的二进制结果用pickle反序列化即可拿到原始数据,示例代码如下:

import pickle
import sqlalchemy
from sqlalchemy import create_engine

engine = create_engine('postgresql+psycopg2://postgres:123@localhost:5432/celery')
conn = engine.connect()
# 按任务ID查询结果
task_id = "eb21609d-0f84-47c7-afb4-9bccbe41eda4"
cursor = conn.execute("SELECT result FROM celery_taskmeta WHERE task_id = %s", (task_id,))
res_bin = cursor.fetchone()[0]
# 反序列化拿到原始结果
raw_result = pickle.loads(bytes(res_bin))
print(raw_result) # 输出为5

方法2:修改配置使用JSON序列化,方便跨组件读取

如果需要其他非Python组件也能直接读取结果,可以把Celery的结果序列化器改为JSON,修改tasks.py配置即可:

from celery import Celery

app = Celery('tasks',
             backend='db+postgresql://postgres:123@localhost:5432/celery',
             broker='redis://localhost:6379/0')

# 新增序列化相关配置
app.conf.update(
    result_serializer = 'json',
    accept_content = ['json'],
    task_serializer = 'json'
)

@app.task(name='tasks.add')
def add(x:int, y:int) -> int:
    return x + y

修改后重启Celery worker,新生成的任务结果会以明文JSON格式存储在PostgreSQL中,直接查询即可看到可读的结果内容,无需额外反序列化操作,同时JSON格式也支持跨语言读取,安全性比pickle更高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:15:04