如何让Prisma适配SQL Server自增主键?无法修改现有库
解决Prisma Introspect未识别SQL Server IDENTITY主键的问题
核心问题原因
Prisma对SQL Server的IDENTITY列执行introspect时,默认不会自动添加@default(autoincrement())属性,导致生成的schema中主键列缺少自增配置,进而调用create方法时被强制要求传入主键值。
解决方案
通过自动化脚本补全schema配置的方式,避免每次introspect后手动修改,同时保留Prisma返回插入主键的特性:
确认正确的Schema配置
你的Note表主键需要补充@default(autoincrement())属性,正确配置如下:model Note { NOTE_ID Decimal @id(map: "PK_NOTE") @default(autoincrement()) @db.Decimal(8, 0) // 其他表字段... }该配置会映射SQL Server的
IDENTITY特性,让Prisma识别到主键由数据库自动生成,调用create时无需传入主键值,且会返回生成的主键。编写自动化修复脚本
创建fix-schema.js文件,用于introspect后自动补全NOTE_ID的自增配置:const fs = require('fs').promises; const path = require('path'); async function fixNoteSchema() { const schemaPath = path.join(__dirname, 'prisma/schema.prisma'); let schemaContent = await fs.readFile(schemaPath, 'utf8'); // 匹配NOTE_ID行并插入自增配置 schemaContent = schemaContent.replace( /NOTE_ID Decimal @id\(map: "PK_NOTE"\) @db\.Decimal\(8, 0\)/, 'NOTE_ID Decimal @id(map: "PK_NOTE") @default(autoincrement()) @db.Decimal(8, 0)' ); await fs.writeFile(schemaPath, schemaContent, 'utf8'); console.log('Schema修复完成:已为NOTE_ID添加自增配置'); } fixNoteSchema().catch(err => console.error('修复schema失败:', err));配置自动执行逻辑
在项目package.json中添加postintrospect脚本,让Prisma执行完introspect后自动运行修复脚本:{ "scripts": { "postintrospect": "node fix-schema.js", // 其他项目脚本... } }
验证效果
- 运行
prisma introspect后,脚本会自动修改schema.prisma中的Note模型 - 调用
prisma.note.create({ data: { /* 仅传入其他业务字段 */ } })时,无需传入NOTE_ID,数据库自动生成主键 - 调用成功后,Prisma会返回包含自动生成的
NOTE_ID的完整记录
内容的提问来源于stack exchange,提问作者jinglesthula
相关产品推荐
相关产品推荐

