Database
 sql >> Base de données >  >> RDS >> Database

Utilisation de plusieurs champs pour une clé unique dans Prisma

J'ai rencontré un problème avec Prisma qui m'a fait perdre un peu de temps, alors je vais écrire comment je l'ai résolu.

Le modèle n'avait pas d'id champ marqué comme @id donc j'ai ajouté un @@unique() dire user et tweet , ensemble, ont défini le unique contraindre.

model Like {
  user      Int
  tweet     Int
  createdAt DateTime @default(now())
  @@unique([user, tweet])
}

Cela signifie que nous ne pouvons pas avoir plus d'une même entrée de (user, tweet) entrées.

Lorsque j'ai essayé de supprimer une entrée avec

await prisma.like.delete({
  where: {
    user: 1,
    tweet: 1
  }
})

Je rencontre un message d'erreur :

PrismaClientValidationError: 
Invalid `prisma.like.delete()` invocation:

{
  where: {
    user: 12,
    ~~~~
    tweet: 22
    ~~~~~
  }
  ~~~~~~~~~~~
}

Argument where of type LikeWhereUniqueInput needs exactly one argument, but you provided user and tweet. Please choose one. Available args: 
type LikeWhereUniqueInput {
  user_tweet?: LikeUserTweetCompoundUniqueInput
}

Ce que je devais faire était de changer

await prisma.like.delete({
  where: {
    user: 1,
    tweet: 1
  }
})

à

await prisma.like.delete({
  where: {
    user_tweet: {
      user: 1,
      tweet: 1
    }
  }
})

En d'autres termes, combiner les champs uniques en les concaténant avec un trait de soulignement.

Rétrospectivement, le message d'erreur expliquait en quelque sorte cela, mais je ne l'ai pas compris.