约束上的唯一约束失败:prisma 中的“User_Account_userId_key”

pra*_*nit 8 javascript mysql prisma

你好,我有三个型号

model User {
  user_id      Int      @id @default(autoincrement())
  email   String   @unique
  name    String?
  User_Account User_Account[]
}

model Account {
  account_id Int @id @default (autoincrement()) @unique
  email String 
  bank String
  createdAt DateTime @default(now())
  User_Account User_Account[]

}
model User_Account {
  id Int @id @default(autoincrement())
  accountId Int 
  userId Int 
  User User @relation(fields: [userId], references: [user_id])
  Account Account @relation(fields: [accountId], references: [account_id])
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试像这样播种我的数据库

const data = [
    {
      id: 1,
      email: 'pranit1@mf.com',
      name: 'Pranit1',
      bank: 'VCB',
      ids: [1,1]
    },
    {
      id: 2,
      email: 'pranit1@mf.com',
      name: 'Pranit1',
      bank: 'ACB',
      ids: [1,2]
    },
    {
      id: 3,
      email: 'pranit3@mf.com',
      name: 'Pranit3',
      bank: 'VCB',
      ids: [2,3]
    }
  ]
  const users = await prisma.$transaction(
    data.map(user =>
      prisma.user.upsert({
        where: { email: user.email },
        update: {},
        create: { name: user.name,
        email:user.email },
      })
    )
  );
  
  const accounts = await prisma.$transaction(
    data.map(account => 
      prisma.account.upsert({
        where: { account_id: account.id },
        update: {},
        create: { bank: account.bank ,
          email :account.email },
      })
    )
  );

  const user_accounts = await prisma.$transaction(
    data.map(uacc =>{
      console.log(uacc);
      return prisma.user_Account.upsert({
        where: { id: uacc.id },
        update: {id: uacc.id},
        create:{
          userId: uacc.ids[0],
        accountId: uacc.ids[1] },
      })}
    )
  );
Run Code Online (Sandbox Code Playgroud)

不过我得到了

唯一约束在约束上失败:User_Account_userId_key

prisma studio中的数据生成如图所示在此输入图像描述

我只是想创建用户和帐户,并且一个用户可以与多个帐户关联。它们的关系显示在 User_Account 表中。我不明白为什么当我在 userId 上没有 @unique 标签时会收到唯一约束错误

Vic*_*ris 5

我无法在我这边重现该错误。但我怀疑您已经在数据库上有记录,并且它们与您的播种者的 ID 冲突。此外,您还可以对架构进行一些改进以使其更简单。

  1. 由于您没有关于多对多关系的任何额外详细信息,因此您可以摆脱 User_Account 模型并让 Prisma 为您处理。
  2. 在播种机上,您可以利用 Prisma 的嵌套功能,这样您就不必手动链接记录。这样,您就不必担心 ids。

schema.prisma 建议

model User {
  id       Int       @id @default(autoincrement())
  email    String    @unique
  name     String?
  accounts Account[]
}

model Account {
  id        Int      @id @unique @default(autoincrement())
  email     String
  bank      String
  users     User[]
  createdAt DateTime @default(now())
}

Run Code Online (Sandbox Code Playgroud)

Seed.js 建议

model User {
  id       Int       @id @default(autoincrement())
  email    String    @unique
  name     String?
  accounts Account[]
}

model Account {
  id        Int      @id @unique @default(autoincrement())
  email     String
  bank      String
  users     User[]
  createdAt DateTime @default(now())
}

Run Code Online (Sandbox Code Playgroud)