如何在Prisma中定义自动生成特定格式的唯一字符串ID
在Prisma中生成带前缀的自增字符串ID
Prisma本身没有内置支持这种带前缀的自增字符串ID,但可以通过两种实用方案实现需求:
方案1:Prisma中间件+数据库自增字段
这种方案不依赖数据库特定特性,通用性强:
- 调整模型结构,新增一个自增数字字段作为ID生成的基础:
model Company { id String @unique // 最终生成C00000001格式 serialId Int @id @default(autoincrement()) // 数据库自增主键 companyName String @unique companyDescription String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt }
- 添加Prisma中间件,在创建记录时自动生成格式化ID:
// 在Prisma客户端初始化文件(如prisma/client.ts)中添加 import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); prisma.$use(async (params, next) => { if (params.model === 'Company' && params.action === 'create') { // 先创建基础记录,获取自动生成的serialId const createdRecord = await next(params); // 生成带前缀的格式化ID const formattedId = `C${createdRecord.serialId.toString().padStart(8, '0')}`; // 更新记录的id字段 return prisma.company.update({ where: { serialId: createdRecord.serialId }, data: { id: formattedId }, }); } return next(params); }); export default prisma;
方案2:数据库生成列(推荐,性能更优)
如果你的数据库支持生成列(PostgreSQL 12+、MySQL 5.7+等),可以直接在数据库层面自动生成格式化ID:
- 调整Prisma模型:
model Company { id String @unique @db.VarChar(10) // 固定长度适配C+8位数字 serialId Int @id @default(autoincrement()) companyName String @unique companyDescription String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("companies") }
- 手动修改迁移SQL文件:
运行npx prisma migrate dev --name add-formatted-id生成迁移文件,打开后替换为对应数据库的SQL:
PostgreSQL版本
CREATE TABLE "companies" ( "serialId" SERIAL NOT NULL, "id" VARCHAR(10) GENERATED ALWAYS AS ('C' || lpad("serialId"::text, 8, '0')) STORED NOT NULL, "companyName" TEXT NOT NULL, "companyDescription" TEXT, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL, CONSTRAINT "companies_pkey" PRIMARY KEY ("serialId"), CONSTRAINT "companies_id_key" UNIQUE ("id"), CONSTRAINT "companies_companyName_key" UNIQUE ("companyName") );
MySQL版本
CREATE TABLE `companies` ( `serialId` INT NOT NULL AUTO_INCREMENT, `id` VARCHAR(10) GENERATED ALWAYS AS (CONCAT('C', LPAD(`serialId`, 8, '0'))) STORED NOT NULL, `companyName` VARCHAR(255) NOT NULL, `companyDescription` TEXT, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, PRIMARY KEY (`serialId`), UNIQUE KEY `companies_id_key` (`id`), UNIQUE KEY `companies_companyName_key` (`companyName`) );
执行迁移后,数据库会自动根据serialId生成C00000001格式的ID,创建记录时无需手动传入id或serialId。
内容的提问来源于stack exchange,提问作者Bablu Ahmed
相关产品推荐
相关产品推荐

