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 写法
语句里的WHERE条件不是必须的,但加上可以跳过本身不含await prisma.$executeRaw` UPDATE 你的实际表名 SET content = REPLACE(content, 'item', '') WHERE content LIKE '%item%' `item字符串的记录,减少不必要的行锁和表扫描,更新速度更快。 - 方案2:查后内存处理再批量更新(无原生SQL,适合小数据量场景)
如果不想写原生SQL,且表的数据量在万级以内,可以先把待更新的记录查出来,在JS层完成字符串替换后,走事务批量提交更新,全用Prisma标准API,不需要区分数据库类型:
这个方案的缺点是数据量大的时候会产生很多条update语句,性能比原生SQL差很多,数据量超过10万条不建议用。// 先查所有待更新的记录 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', '') } })) )
补充说明:如果你的项目用的是MongoDB的Prisma客户端,可以直接用$runCommandRaw调用MongoDB的$replaceAll聚合操作完成更新,逻辑和关系型数据库的原生SQL方案一致。
内容的提问来源于stack exchange,提问作者伊豆湖卧烟
相关产品推荐
相关产品推荐

