100 % local: tus datos nunca salen de tu navegador

JSON a Prisma — un modelo que sí migra

Convierte una muestra JSON en un modelo de Prisma. El identificador que todo modelo necesita está siempre: prisma validate pasa y la migración se ejecuta.

Instantáneo Privado Cero cookies

Entrada JSON

Salida Prisma

Qué hace esta herramienta

Una muestra JSON pasa a ser un modelo de Prisma.

{ "id": 1, "name": "Ada", "tags": ["admin"], "score": 9.5 }
model Root {
  id    Int      @id
  name  String
  tags  String[]
  score Float
}

El modelo solo no es un schema.prisma: un archivo que funciona lleva además un bloque datasource y uno generator. Describen tu base y tu cliente, de los que una carga JSON no dice nada.

Todo modelo recibe un identificador

Prisma rechaza un modelo sin @id (o @@id): prisma validate se detiene ahí. Por tanto:

  • un id de tipo Int o String pasa a ser el identificador;
  • si no hay id, se añade uno: id Int @id @default(autoincrement());
  • un id de otro tipo —flotante, booleano, objeto anidado— se renombra y conserva su clave original:
model Root {
  id   Int    @id @default(autoincrement())
  id2  Float  @map("id")
  name String
}

Ese último caso producía un modelo sin identificador alguno: Prisma de apariencia válida que la herramienta de línea de comandos rechaza. Encontrado al escribir esta página y corregido.

No se inventa nada que parezca una relación

Un objeto anidado pasa a columna Json. Podría haber sido una relación con otra tabla, y adivinarlo sería inventar un modelo, una clave foránea y un sentido a partir de un documento. Lo mismo para un array de objetos y para un array heterogéneo.

Una lista homogénea de escalares sí recibe lista nativa —String[], Int[]—, que existe en PostgreSQL, CockroachDB y MongoDB. En MySQL o SQLite, pásala a Json: la salida no tiene datasource, así que no puede saber cuál usas.

Nombres, nulabilidad y lo que una muestra no dice

Los nombres de campo pasan a camelCase, y @map conserva la clave original en cuanto ambas difieren: content-type pasa a contentType @map("content-type") y el nombre de tu columna no cambia. Dos claves que dan el mismo camelCase llevan sufijo en vez de fundirse.

Solo null produce una columna opcional, Json?. Todo lo demás es obligatorio, porque la muestra traía un valor, y una muestra es el sitio equivocado para enterarse de que una columna admite nulos. El ? es un carácter, y te toca a ti.

Privado por diseño

Todo se ejecuta localmente en tu navegador con JavaScript. Tus datos nunca se suben a un servidor, lo que hace que la herramienta sea segura para contenido sensible y funcione sin conexión.

Preguntas frecuentes

¿De dónde sale el `id Int @id @default(autoincrement())`?
De la regla de Prisma: todo modelo exige un identificador. Si tu muestra trae un `id` entero o cadena, ese es. Si no, se añade uno, y un `id` de otro tipo se renombra con `@map("id")` para que la clave original sobreviva. Sin eso, el modelo parecía correcto y `prisma validate` lo rechazaba.
¿Por qué mi objeto anidado es una columna `Json` y no una relación?
Porque una muestra no puede mostrar una relación. `{"author": {"name": "Ada"}}` puede ser una clave foránea a una tabla `Author` o un bloque que pertenece a la fila. Inventar la tabla, la clave y el sentido serían tres suposiciones. `Json` guarda el dato y te deja el modelado, que es tuyo.
`String[]` no compila en MySQL. ¿Por qué está ahí?
Porque una lista homogénea de escalares tiene tipo nativo en PostgreSQL, CockroachDB y MongoDB, y Prisma la escribe `String[]`. MySQL y SQLite no tienen listas escalares: ahí cambia el campo a `Json`. El generador no puede conocer tu fuente de datos: no hay ningún bloque `datasource` en la salida.

Convertidores relacionados