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

