{
  "id": "ai-generates-invalid-prisma-relations",
  "type": "failures",
  "category": "failures",
  "locale": "pt",
  "url": "/pt/failures/ai-generates-invalid-prisma-relations",
  "title": "Como Corrigir Relações Inválidas Geradas por IA no Prisma",
  "description": "Agentes de IA geram relações de esquema Prisma com relações reversas ausentes, ações referenciais erradas ou tipos de campo incompatíveis que falham no prisma validate e prisma migrate.",
  "tools": [
    "Cursor",
    "Claude Code",
    "Codex",
    "Windsurf"
  ],
  "stack": [
    "PostgreSQL",
    "TypeScript"
  ],
  "tags": [
    "prisma",
    "postgres",
    "sql"
  ],
  "difficulty": null,
  "updated": "2026-06-08",
  "markdown": "O agente escreve um esquema Prisma com relações que parecem corretas, mas falham\n`prisma validate` devido a referências reversas ausentes, incompatibilidades de tipo ou\nconfigurações ambíguas de múltiplas relações.\n\n## O sintoma\n\nUma relação é declarada em um modelo sem sua contraparte necessária no outro,\nou o tipo do campo de chave estrangeira não corresponde ao campo referenciado.\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\nExecutar `prisma validate` produz:\n\n```\nError: The relation field `posts` on model `User` is missing an opposite\nrelation field on the model `Post`.\n```\n\n## Por que isso acontece\n\nO agente geralmente escreve um lado de uma relação e esquece de adicionar o outro,\nespecialmente em casos muitos-para-muitos ou autorreferenciais. Ele também copia tipos\nde campo da memória sem verificar se `authorId` deve corresponder exatamente ao tipo\ndo `id` referenciado.\n\n## Como identificar\n\n- `prisma validate` ou `prisma migrate dev` falha com um erro de relação.\n- Um modelo tem um campo de array (um-para-muitos), mas o modelo referenciado não tem\n  chave estrangeira escalar ou atributo `@relation`.\n- Muitos-para-muitos usa tabelas de junção explícitas com tipos incompatíveis.\n- Modelos autorreferenciais (por exemplo, árvores de categorias) têm apenas um lado do\n  par `@relation(name: \"...\")`.\n\n## Como corrigir\n\nToda relação deve ter ambos os lados declarados. Os tipos escalares de chave estrangeira devem\ncorresponder exatamente ao tipo do campo referenciado.\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\nPara uma árvore autorreferencial:\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 Correção\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## Teste\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```"
}