Cómo corregir relaciones inválidas de Prisma generadas por IA
Los agentes de IA generan relaciones de esquema Prisma con relaciones inversas faltantes, acciones referenciales incorrectas o tipos de campo no coincidentes que fallan en prisma validate y prisma migrate.
El agente escribe un esquema Prisma con relaciones que parecen correctas pero fallan
en prisma validate debido a referencias inversas faltantes, tipos no coincidentes o
configuraciones ambiguas de múltiples relaciones.
El síntoma
Se declara una relación en un modelo sin su contraparte requerida en el otro, o el tipo del campo de clave foránea no coincide con el campo referenciado.
// schema.prisma — WRONGmodel User { id String @id @default(cuid()) posts Post[]}
model Post { id String @id @default(cuid()) authorId Int // Int, but User.id is String — type mismatch // Missing: author User @relation(fields: [authorId], references: [id])}Ejecutar prisma validate produce:
Error: The relation field `posts` on model `User` is missing an oppositerelation field on the model `Post`.Por qué ocurre
El agente a menudo escribe un lado de una relación y se olvida de agregar el otro,
especialmente en casos de muchos a muchos o autorreferenciales. También copia tipos
de campo de memoria sin verificar que authorId debe coincidir exactamente con el tipo
id de referencia.
Cómo detectarlo
prisma validateoprisma migrate devfalla con un error de relación.- Un modelo tiene un campo de arreglo (uno a muchos) pero el modelo referenciado no tiene
clave foránea escalar o atributo
@relation. - Muchos a muchos usa tablas de unión explícitas con tipos no coincidentes.
- Modelos autorreferenciales (ej. árboles de categorías) tienen solo un lado del par
@relation(name: "...").
Cómo corregirlo
Cada relación debe tener ambos lados declarados. Los tipos escalares de clave foránea deben coincidir exactamente con el tipo del campo referenciado.
// schema.prisma — CORRECTmodel User { id String @id @default(cuid()) posts Post[] // one-to-many: back-reference}
model Post { id String @id @default(cuid()) authorId String // String, matches User.id author User @relation(fields: [authorId], references: [id], onDelete: Cascade)}Para un árbol autorreferencial:
model Category { id String @id @default(cuid()) parentId String? parent Category? @relation("CategoryTree", fields: [parentId], references: [id]) children Category[] @relation("CategoryTree")}[ ] Run "prisma validate" before "prisma migrate dev" — fix all errors first[ ] Every @relation on model A has a matching field on model B[ ] Foreign key scalar type matches the referenced @id type (String/Int/cuid)[ ] Self-referential relations use a named @relation("name") on both sides[ ] Explicit many-to-many join tables declare both foreign keys with onDelete[ ] onDelete referential action is explicit (Cascade, Restrict, SetNull) — not left to defaultPrompt de corrección
This Prisma schema fails prisma validate. Fix every relation error: add themissing back-reference fields, ensure all foreign key scalar types exactly matchthe referenced @id type, give every self-referential relation a unique name onboth sides, and set explicit onDelete actions (Cascade for required relations,SetNull for optional). Run prisma validate after each change until it passes.Prueba
# Validate schema before attempting migrationnpx prisma validate && echo "Schema OK" || echo "FAIL: schema invalid"
# Also check for type mismatches (Int fk -> String id is a common error)grep -A3 "@relation" prisma/schema.prisma