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

Prisma ORM更新记录不生效问题排查及疑问咨询

Prisma ORM Update方法问题解答

问题1:为何ORM方式执行update时记录未被更新?

核心问题大概率出在state: {}的设置上。在Prisma 3.15.2版本中,针对JSON/JSONB类型字段,设置空对象{}可能不会被识别为有效的变更(尤其是当原字段值本身就是空对象或null时),或者触发了Prisma内部更新判断逻辑的缺陷,导致整个更新操作被静默跳过。

另外,你在data中重复设置了与where条件值一致的address字段,虽然理论上不影响,但多余的无变更字段可能干扰Prisma的变更检测逻辑。同时也要检查safeProperties是否包含了其他与数据库现有值完全一致的字段,这类无变更字段也可能让Prisma判定没有需要更新的内容,进而跳过执行。

问题2:data.address的值为何会影响更新结果?

你在data中传入了与where条件相同的address值,当数据库中该记录的address字段已经等于addressAsUnsigned时,Prisma会识别该字段无变更并忽略更新。但在3.15.2这类旧版本中,对查询条件字段的无变更赋值,可能意外干扰整个更新操作的执行逻辑,导致其他有变更的字段也未被更新。

此外,如果你的Prisma Schema中address字段定义为有符号整数(如Int),但实际存储的是无符号整数,address >>> 0转换后的值可能存在类型匹配的隐性问题,导致Prisma对比新旧值时出现误判,最终跳过更新。

问题3:更新实体时是否需要提供所有字段?

不需要。Prisma的update方法支持部分字段更新,你只需要传入需要修改的字段即可。这种方式不仅更高效,还能避免因误传其他字段导致的意外变更。比如你的原生SQL只更新了expire和valid,ORM方式也完全可以只传这两个字段(加上需要保留的safeProperties)。


修复建议代码示例

const { valid: validFor, expire, state, address, ...safeProperties } = data;

const addressAsUnsigned = address >>> 0;
const extendBy = newValidFor - validFor;
const extended = add(expire, { seconds: extendBy });

const payload: Prisma.DataTableUpdateArgs = {
  where: { address: addressAsUnsigned },
  data: {
    ...safeProperties,
    expire: extended,
    valid: authenticated,
    // 若无需清空state则移除该行;若需清空,可尝试设置为null(需Schema允许)或升级Prisma版本
    // state: null,
  },
}

const result = await db.dataTable.update(payload);

额外验证步骤

  1. 先移除data中的state: {}和address字段,重新执行ORM更新,确认是否生效。
  2. 若确实需要更新state,可尝试设置为null(需确保Schema中该字段允许为null),或者升级到更高版本的Prisma(后续版本修复了不少JSON字段相关的问题)。
  3. 清理safeProperties中的冗余字段,只保留需要更新的内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:27:35