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

Prisma ORM如何批量更新所有记录替换字段中的指定字符串

Prisma实现content字段批量移除指定字符串的方法

Prisma 标准客户端的基础updateManyAPI 不支持直接在更新逻辑里调用数据库内置的字符串替换函数,要实现这个需求有两种成熟方案,根据你的场景选就行:

  • 方案1:原生SQL批量更新(推荐,性能最优)
    用Prisma提供的$executeRaw方法直接跑数据库的替换语句,一次请求就能完成全表更新,性能和直接写SQL一致,注意用标签模板的写法传参可以自动规避SQL注入问题。
    按你用的数据库选对应代码即可,注意把表名替换成你自己业务里的实际表名:

    MySQL/MariaDB 写法

    await prisma.$executeRaw`
      UPDATE 你的实际表名
      SET content = REPLACE(content, 'item', '')
      WHERE content LIKE '%item%'
    `
    

    PostgreSQL 写法(注意表名默认要加双引号,如果你schema里做了小写映射可以去掉)

    await prisma.$executeRaw`
      UPDATE "你的实际表名"
      SET content = REPLACE(content, 'item', '')
      WHERE content LIKE '%item%'
    `
    

    SQLite 写法

    await prisma.$executeRaw`
      UPDATE 你的实际表名
      SET content = REPLACE(content, 'item', '')
      WHERE content LIKE '%item%'
    `
    
    语句里的WHERE条件不是必须的,但加上可以跳过本身不含item字符串的记录,减少不必要的行锁和表扫描,更新速度更快。
  • 方案2:查后内存处理再批量更新(无原生SQL,适合小数据量场景)
    如果不想写原生SQL,且表的数据量在万级以内,可以先把待更新的记录查出来,在JS层完成字符串替换后,走事务批量提交更新,全用Prisma标准API,不需要区分数据库类型:
    // 先查所有待更新的记录
    const targetRecords = await prisma.item.findMany({
      where: {
        content: {
          contains: 'item'
        }
      },
      select: {
        id: true,
        content: true
      }
    })
    // 组装更新任务,走事务批量提交
    await prisma.$transaction(
      targetRecords.map(record => prisma.item.update({
        where: { id: record.id },
        data: { content: record.content.replaceAll('item', '') }
      }))
    )
    
    这个方案的缺点是数据量大的时候会产生很多条update语句,性能比原生SQL差很多,数据量超过10万条不建议用。

补充说明:如果你的项目用的是MongoDB的Prisma客户端,可以直接用$runCommandRaw调用MongoDB的$replaceAll聚合操作完成更新,逻辑和关系型数据库的原生SQL方案一致。

内容的提问来源于stack exchange,提问作者伊豆湖卧烟

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:09:46