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

使用Prisma关联批量创建Modcod资源失败:是限制还是操作失误?

问题描述

我定义了以下两个Prisma模型:

model Terminal {
    terminal_id   Int      @id @default(autoincrement())
    terminal_name String
    created_at    DateTime @default(now())
    updated_at    DateTime @updatedAt
    modcods       Modcod[]

    @@map("terminal")
}

model Modcod {
    modcod_id   Int      @id @default(autoincrement())
    name        String?
    created_at  DateTime @default(now())
    updated_at  DateTime @updatedAt
    terminal    Terminal @relation(fields: [terminal_id], references: [terminal_id], onDelete: Cascade, onUpdate: Cascade)
    terminal_id Int

    @@map("modcod")
}

单个创建Modcod的功能正常运行:

export async function createSingleModcod(modcod: Modcod, terminal_id: number) {
  const modcod = await prisma.modcod.create({
    data: {
      ...modcod,
      terminal_id, // 来自请求体的terminal_id
    },
  });
  await prisma.$disconnect();
  return modcod;
}

但批量创建多个Modcod的两个方案都无法正常工作:

方案1(使用$transaction):

export async function createManyModcods(modcods: Modcods[], terminal_id: number) {
  const modcods = await prisma.$transaction(
    modcods.map((modcod) =>
      prisma.modcod.create({
        data: {
          ...modcod,
          terminal_id, // 来自请求体的terminal_id
        },
      }),
    ),
  );
  await prisma.$disconnect();
  return modcods;
}

方案2(使用createMany):

export async function createManyModcodsAlt(modcods: Modcods[], terminal_id: number) {
  const modcods = await prisma.modcod.createMany({
    data: modcods.map((modcod) => ({
      ...modcod,
      terminal_id,
    })),
  });
  await prisma.$disconnect();
  return modcods;
}

我想知道这是Prisma的限制,还是我的操作有误?预期是批量创建能和单个创建一样正常工作。


解决方法

你的批量创建代码存在两个核心问题,并非Prisma的限制:

1. 变量名重复导致作用域冲突

两个批量函数中,参数名modcods和内部声明的变量名modcods完全重复,这会触发变量遮蔽问题,直接导致运行时错误。需要修改内部变量名,比如改为createdModcods。

2. createMany的返回值特性

Prisma的createMany方法不会返回创建的具体记录,它仅返回一个包含count字段的对象,用于标识成功创建的记录数量。如果需要获取创建后的Modcod完整数据,不能使用createMany,必须通过事务批量调用create方法。

修正后的$transaction方案

export async function createManyModcods(modcods: Modcod[], terminal_id: number) {
  // 修改内部变量名,避免与参数冲突
  const createdModcods = await prisma.$transaction(
    modcods.map((modcod) =>
      prisma.modcod.create({
        data: {
          ...modcod,
          terminal_id,
        },
      }),
    ),
  );
  await prisma.$disconnect();
  return createdModcods;
}

若仅需统计创建数量,修正后的createMany方案

export async function createManyModcodsAlt(modcods: Modcod[], terminal_id: number) {
  // 修改内部变量名
  const result = await prisma.modcod.createMany({
    data: modcods.map((modcod) => ({
      ...modcod,
      terminal_id,
    })),
  });
  await prisma.$disconnect();
  // 返回创建数量而非记录数组
  return result.count;
}

额外补充:除非是应用终止前的清理操作,否则不建议在每次数据库操作后调用prisma.$disconnect()——Prisma Client会自动管理连接池,频繁断开重连会大幅降低性能。

内容的提问来源于stack exchange,提问作者user19979582

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:15:47