100 % local — seus dados nunca saem do seu navegador

JSON para Prisma — um modelo que migra

Transforme uma amostra JSON num modelo do Prisma. O identificador que todo modelo exige está sempre lá: o prisma validate passa e a migração roda.

Instantâneo Privado Zero cookies

Entrada JSON

Saída Prisma

O que esta ferramenta faz

Uma amostra JSON vira um modelo Prisma.

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

O modelo sozinho não é um schema.prisma: um arquivo que funciona tem também um bloco datasource e um generator. Eles descrevem o seu banco e o seu cliente, dos quais uma carga JSON nada diz.

Todo modelo recebe um identificador

O Prisma recusa um modelo sem @id (ou @@id): o prisma validate para ali. Portanto:

  • um id do tipo Int ou String vira o identificador;
  • nenhum id e um é acrescentado: id Int @id @default(autoincrement());
  • um id de outro tipo — flutuante, booleano, objeto aninhado — é renomeado e guarda a sua chave original:
model Root {
  id   Int    @id @default(autoincrement())
  id2  Float  @map("id")
  name String
}

Esse último caso produzia um modelo sem identificador nenhum: Prisma de aparência válida que a ferramenta de linha de comando recusa. Encontrado ao escrever esta página e corrigido.

Nada que pareça uma relação é inventado

Um objeto aninhado vira uma coluna Json. Poderia ter sido uma relação com outra tabela, e adivinhar seria inventar um modelo, uma chave estrangeira e um sentido a partir de um documento. O mesmo para um array de objetos e para um array heterogêneo.

Uma lista homogênea de escalares ganha, sim, lista nativa — String[], Int[] —, que existe no PostgreSQL, no CockroachDB e no MongoDB. No MySQL ou no SQLite, troque-a por Json: a saída não tem datasource, então não pode saber qual você usa.

Nomes, nulidade e o que uma amostra não diz

Os nomes de campo passam a camelCase, e @map guarda a chave original sempre que as duas diferem: content-type vira contentType @map("content-type") e o nome da sua coluna não muda. Duas chaves que dão o mesmo camelCase levam sufixo em vez de se fundirem.

Só null produz uma coluna opcional, Json?. Todo o resto é obrigatório, porque a amostra trazia um valor — e uma amostra é o lugar errado para descobrir que uma coluna aceita nulos. O ? tem um caractere, e cabe a você.

Privado por padrão

Tudo é executado localmente no seu navegador com JavaScript. Os seus dados nunca são enviados para um servidor, o que torna a ferramenta segura para conteúdo sensível e funciona offline.

Perguntas frequentes

De onde vem o `id Int @id @default(autoincrement())`?
Da regra do Prisma: todo modelo exige um identificador. Se a sua amostra tem um `id` inteiro ou string, é ele. Senão um é acrescentado, e um `id` de outro tipo é renomeado com `@map("id")` para que a chave original sobreviva. Sem isso, o modelo parecia certo e o `prisma validate` o recusava.
Por que meu objeto aninhado é uma coluna `Json` e não uma relação?
Porque uma amostra não consegue mostrar uma relação. `{"author": {"name": "Ada"}}` pode ser uma chave estrangeira para uma tabela `Author` ou um bloco que pertence à linha. Inventar a tabela, a chave e o sentido seriam três palpites. `Json` guarda o dado e deixa a modelagem com você, que é de quem ela é.
`String[]` não compila no MySQL. Por que está aí?
Porque uma lista homogênea de escalares tem tipo nativo no PostgreSQL, no CockroachDB e no MongoDB, e o Prisma a escreve `String[]`. MySQL e SQLite não têm listas escalares: ali troque o campo por `Json`. O gerador não pode conhecer a sua fonte de dados — não há bloco `datasource` algum na saída.

Conversores relacionados