如何在JavaScript中使用Prisma同款cuid()函数进行PostgreSQL数据迁移
解决Prisma迁移效率与cuid()一致性问题
一、批量SQL迁移提升效率方案
直接用原生SQL做迁移能大幅降低ORM带来的额外开销,建议采用分批次查询+批量插入+事务包裹的方式:
- 从原表按批次拉取数据(比如每次取1000条)
- 对每条数据生成对应ID后组装批量INSERT语句
- 通过Prisma的
$executeRawUnsafe执行原生SQL,跳过ORM的逐行处理逻辑
二、获取与Prisma一致的cuid()实现
Prisma目前默认使用cuid2作为cuid生成器(旧版Prisma<v4.16用的是原cuid包),直接安装对应包即可:
针对新版Prisma(v4.16+)
npm install @paralleldrive/cuid2
在JS中导入使用:
import { createId } from '@paralleldrive/cuid2'; // 生成和Prisma schema中cuid()完全一致的ID const newId = createId(); // 组装批量插入SQL(注意参数化避免注入风险) const batchValues = originalDataList.map(item => `('${createId()}', '${item.attr1}', '${item.attr2}', '${item.attr3}')` ).join(','); const insertQuery = `INSERT INTO new_format_table(id, attr1, attr2, attr3) VALUES ${batchValues}`; // 执行原生SQL await prisma.$executeRawUnsafe(insertQuery);
针对旧版Prisma(<v4.16)
npm install cuid
导入使用:
import cuid from 'cuid'; const newId = cuid();
三、验证cuid一致性的方法
- 在Prisma Studio中创建一条测试数据,复制其ID
- 用安装的包生成ID,对比格式:
- cuid2生成的是7-10位随机字符串(如
k8m2p7x0) - 旧版cuid生成的ID以
c开头(如c5f8d2a9b3)
- cuid2生成的是7-10位随机字符串(如
四、迁移关键注意事项
- 用事务包裹整个迁移流程,避免中途失败导致数据不一致:
await prisma.$transaction(async (tx) => { // 分批次查询+插入逻辑 }); - 控制单批次数据量(1000-5000条为宜),避免内存溢出或数据库锁表
- 迁移前务必备份数据库,先在测试环境验证再操作生产环境
内容的提问来源于stack exchange,提问作者GABRIEL R GARCIA-AVILES
相关产品推荐
相关产品推荐

