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

Prisma中@db.Decimal返回对象格式问题:如何获取纯数值?

解决Prisma Decimal字段返回对象而非数值的问题

当你在Prisma Schema中定义了Decimal类型字段(如value Decimal? @db.Decimal(7, 4)),查询后得到的是包含s、e、d属性的Decimal对象,想要直接返回数值格式,可以用以下几种方式处理:

1. 查询后手动转换

Decimal对象自带toNumber()方法,可直接将其转为Number类型:

// 查询数据
const data = await prisma.yourModel.findFirst({ /* 查询条件 */ });

// 转换value字段
const processedData = {
  ...data,
  value: data.value ? data.value.toNumber() : null
};

如果是数组结果,遍历处理即可:

const dataList = await prisma.yourModel.findMany({ /* 查询条件 */ });
const processedList = dataList.map(item => ({
  ...item,
  value: item.value ? item.value.toNumber() : null
}));

2. 用Prisma中间件自动转换

如果不想每次查询都手动处理,可以通过Prisma中间件全局拦截并转换所有Decimal字段:

// 在初始化Prisma Client后添加中间件
prisma.$use(async (params, next) => {
  const result = await next(params);

  // 递归遍历结果,转换所有Decimal对象
  function transformDecimals(obj) {
    if (!obj || typeof obj !== 'object') return obj;

    for (const key in obj) {
      const value = obj[key];
      // 判断是否为Decimal对象
      if (value?.constructor?.name === 'Decimal') {
        obj[key] = value.toNumber();
      } else if (typeof value === 'object') {
        transformDecimals(value);
      }
    }
    return obj;
  }

  return transformDecimals(result);
});

添加后,所有查询返回的Decimal字段都会自动转为Number类型,无需额外处理。

注意事项

  • 你的字段是@db.Decimal(7,4),最大值为99999.9999,在JavaScript Number的精度范围内(Number可精确表示整数到2^53),用toNumber()不会有精度问题。
  • 如果是更大精度的Decimal字段,建议转为字符串避免精度丢失,此时将toNumber()替换为toString()即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:01:04