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

如何让Prisma适配SQL Server自增主键?无法修改现有库

解决Prisma Introspect未识别SQL Server IDENTITY主键的问题

核心问题原因

Prisma对SQL Server的IDENTITY列执行introspect时,默认不会自动添加@default(autoincrement())属性,导致生成的schema中主键列缺少自增配置,进而调用create方法时被强制要求传入主键值。

解决方案

通过自动化脚本补全schema配置的方式,避免每次introspect后手动修改,同时保留Prisma返回插入主键的特性:

  1. 确认正确的Schema配置
    你的Note表主键需要补充@default(autoincrement())属性,正确配置如下:

    model Note {
      NOTE_ID Decimal @id(map: "PK_NOTE") @default(autoincrement()) @db.Decimal(8, 0)
      // 其他表字段...
    }
    

    该配置会映射SQL Server的IDENTITY特性,让Prisma识别到主键由数据库自动生成,调用create时无需传入主键值,且会返回生成的主键。

  2. 编写自动化修复脚本
    创建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));
    
  3. 配置自动执行逻辑
    在项目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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 01:12:54