{
  "id": "ai-generates-invalid-prisma-relations",
  "type": "failures",
  "category": "failures",
  "locale": "fr",
  "url": "/fr/failures/ai-generates-invalid-prisma-relations",
  "title": "Comment corriger la génération par IA de relations Prisma invalides",
  "description": "Les agents IA génèrent des schémas Prisma avec des relations manquant de relations inverses, des actions référentielles erronées ou des types de champs incompatibles qui font échouer prisma validate et prisma migrate.",
  "tools": [
    "Cursor",
    "Claude Code",
    "Codex",
    "Windsurf"
  ],
  "stack": [
    "PostgreSQL",
    "TypeScript"
  ],
  "tags": [
    "prisma",
    "postgres",
    "sql"
  ],
  "difficulty": null,
  "updated": "2026-06-08",
  "markdown": "L'agent écrit un schéma Prisma avec des relations qui semblent correctes mais échouent\n`prisma validate` en raison de références inverses manquantes, d'incompatibilités de type ou\nde configurations multi-relations ambiguës.\n\n## Le symptôme\n\nUne relation est déclarée sur un modèle sans sa contrepartie requise sur l'autre,\nou le type du champ de clé étrangère ne correspond pas au type du champ référencé.\n\n```prisma\n// schema.prisma — WRONG\nmodel User {\n  id    String @id @default(cuid())\n  posts Post[]\n}\n\nmodel Post {\n  id       String @id @default(cuid())\n  authorId Int    // Int, but User.id is String — type mismatch\n  // Missing: author User @relation(fields: [authorId], references: [id])\n}\n```\n\nL'exécution de `prisma validate` produit :\n\n```\nError: The relation field `posts` on model `User` is missing an opposite\nrelation field on the model `Post`.\n```\n\n## Pourquoi cela se produit\n\nL'agent écrit souvent un côté d'une relation et oublie d'ajouter l'autre,\nsurtout dans les cas many-to-many ou d'auto-référence. Il copie également les types de champs\nde mémoire sans vérifier que `authorId` doit correspondre exactement au type de l'`id` référencé.\n\n## Comment le repérer\n\n- `prisma validate` ou `prisma migrate dev` échoue avec une erreur de relation.\n- Un modèle a un champ tableau (one-to-many) mais le modèle référencé n'a pas\n  de clé étrangère scalaire ou d'attribut `@relation`.\n- Many-to-many utilise des tables de jointure explicites avec des types incompatibles.\n- Les modèles auto-référents (par exemple, arbres de catégories) n'ont qu'un seul côté de la\n  paire `@relation(name: \"...\")`.\n\n## Comment le corriger\n\nChaque relation doit avoir ses deux côtés déclarés. Les types scalaires de clés étrangères doivent\ncorrespondre exactement au type du champ référencé.\n\n```prisma\n// schema.prisma — CORRECT\nmodel User {\n  id    String @id @default(cuid())\n  posts Post[] // one-to-many: back-reference\n}\n\nmodel Post {\n  id       String @id @default(cuid())\n  authorId String                       // String, matches User.id\n  author   User   @relation(fields: [authorId], references: [id], onDelete: Cascade)\n}\n```\n\nPour un arbre auto-référent :\n\n```prisma\nmodel Category {\n  id       String     @id @default(cuid())\n  parentId String?\n  parent   Category?  @relation(\"CategoryTree\", fields: [parentId], references: [id])\n  children Category[] @relation(\"CategoryTree\")\n}\n```\n\n```txt\n[ ] Run \"prisma validate\" before \"prisma migrate dev\" — fix all errors first\n[ ] Every @relation on model A has a matching field on model B\n[ ] Foreign key scalar type matches the referenced @id type (String/Int/cuid)\n[ ] Self-referential relations use a named @relation(\"name\") on both sides\n[ ] Explicit many-to-many join tables declare both foreign keys with onDelete\n[ ] onDelete referential action is explicit (Cascade, Restrict, SetNull) — not left to default\n```\n\n## Prompt de correction\n\n```txt title=\"Fix Prompt\"\nThis Prisma schema fails prisma validate. Fix every relation error: add the\nmissing back-reference fields, ensure all foreign key scalar types exactly match\nthe referenced @id type, give every self-referential relation a unique name on\nboth sides, and set explicit onDelete actions (Cascade for required relations,\nSetNull for optional). Run prisma validate after each change until it passes.\n```\n\n## Test\n\n```bash\n# Validate schema before attempting migration\nnpx prisma validate && echo \"Schema OK\" || echo \"FAIL: schema invalid\"\n\n# Also check for type mismatches (Int fk -> String id is a common error)\ngrep -A3 \"@relation\" prisma/schema.prisma\n```"
}