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

使用Prisma向SQLite批量插入Pokemon及关联Ability时的异常问题

解决Prisma批量插入Pokemon及关联Ability的异常问题

核心问题根源

  • 事务边界处理错误:若批量插入Pokemon后未在同一事务内处理Ability关联,容易出现部分提交、数据不一致
  • Prisma版本底层bug:internal error: entered unreachable code是旧版Prisma(如3.x系列)SQLite驱动的常见引擎panic问题
  • 关联逻辑漏洞:未正确获取刚插入Pokemon的ID,或Ability关联字段赋值错误

具体修复方案

1. 升级Prisma到最新稳定版

这个panic错误大多和旧版引擎的SQLite适配问题有关,升级后可直接解决底层bug:

npm install prisma@latest
npx prisma generate
npx prisma migrate dev

2. 统一事务包裹所有操作

把Pokemon批量插入、Ability关联插入全部放在同一个事务中,保证原子性(要么全成要么全滚),同时避免部分提交导致的不一致:

async function main() {
  const pokemonData = [/* 你的Pokemon数组数据 */];

  await prisma.$transaction(async (tx) => {
    // 批量插入Pokemon(createMany不支持嵌套关联,单独处理)
    await tx.pokemon.createMany({
      data: pokemonData.map(p => ({
        name: p.name,
        // 其他Pokemon基础字段
      })),
      skipDuplicates: true, // 可选:避免重复插入已存在的Pokemon
    });

    // 获取刚插入的所有Pokemon(用唯一标识name匹配)
    const insertedPokemons = await tx.pokemon.findMany({
      where: { name: { in: pokemonData.map(p => p.name) } },
    });

    // 生成所有Ability的插入Promise,并行执行提高效率
    const abilityTasks = insertedPokemons.flatMap(pokemon => {
      const targetAbilities = pokemonData.find(p => p.name === pokemon.name)?.abilities || [];
      return targetAbilities.map(ability => 
        tx.ability.create({
          data: {
            name: ability.name,
            pokemonId: pokemon.id, // 绑定正确的Pokemon关联ID
            // 其他Ability字段
          },
        })
      );
    });

    await Promise.all(abilityTasks);
  });
}

3. 检查Schema关联定义正确性

确保Prisma Schema中Pokemon和Ability的关系配置无误:

model Pokemon {
  id        Int      @id @default(autoincrement())
  name      String   @unique
  abilities Ability[]
  // 其他字段
}

model Ability {
  id        Int      @id @default(autoincrement())
  name      String
  pokemonId Int
  pokemon   Pokemon  @relation(fields: [pokemonId], references: [id], onDelete: Cascade)
  // 其他字段
}

4. 调试辅助手段

开启Prisma日志,查看具体SQL执行和错误详情:
在prisma/schema.prisma中添加日志配置:

generator client {
  provider = "prisma-client-js"
  log      = ["query", "error"]
}

先测试小批量数据,排查是否因数据量过大触发引擎异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 13:42:54