Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Erro ao executar: npx prisma db seed

Ao tentar executar o comando npx prisma db seed recebo o erro abaixo no console:

danilo.santos in code-connect on  main [!?] via ⬢ v20.11.1 ➜  npx prisma db seed                        
Environment variables loaded from .env
Running seed command `node prisma/seed.js` ...
Seed OK
Author created {
  id: 1,
  name: 'Ana Beatriz',
  username: 'anabeatriz_dev',
  avatar: 'https://raw.githubusercontent.com/viniciosneves/code-connect-assets/main/authors/anabeatriz_dev.png'
}
-- codigo omitido --

PrismaClientValidationError: 
Invalid `prisma.post.upsert()` invocation in
/Users/danilo.santos/Documents/Projetos/code-connect/prisma/seed.js:119:25

  116 ];
  117 
  118 posts.forEach(async (post) => {
→ 119   await prisma.post.upsert({
          where: {
            slug: "introducao-ao-react",
        ?   id?: Int,
        ?   AND?: PostWhereInput | PostWhereInput[],
        ?   OR?: PostWhereInput[],
        ?   NOT?: PostWhereInput | PostWhereInput[],
        ?   cover?: StringFilter | String,
        ?   title?: StringFilter | String,
        ?   body?: StringFilter | String,
        ?   markdown?: StringFilter | String,
        ?   createdAt?: DateTimeFilter | DateTime,
        ?   updatedAt?: DateTimeFilter | DateTime,
        ?   authorId?: IntFilter | Int,
        ?   author?: UserScalarRelationFilter | UserWhereInput
          },
          update: {},
          create: {
            cover: "https://raw.githubusercontent.com/viniciosneves/code-connect-assets/main/posts/introducao-ao-react.png",
            title: "Introdução ao React",
            slug: "introducao-ao-react",
            body: "Neste post, vamos explorar os conceitos básicos do React, uma biblioteca JavaScript para construir interfaces de usuário. Vamos cobrir componentes, JSX e estados.",
            markdown: "```javascript\nfunction HelloComponent() {\n  return <h1>Hello, world!</h1>;\n}\n```",
            authorId: 1
          }
        })

Argument `where` of type PostWhereUniqueInput needs at least one of `id` arguments. Available options are marked with ?.
    at wn (/Users/danilo.santos/Documents/Projetos/code-connect/node_modules/@prisma/client/runtime/library.js:29:1363)
    at qn.handleRequestError (/Users/danilo.santos/Documents/Projetos/code-connect/node_modules/@prisma/client/runtime/library.js:121:6958)
    at qn.handleAndLogRequestError (/Users/danilo.santos/Documents/Projetos/code-connect/node_modules/@prisma/client/runtime/library.js:121:6640)
    at qn.request (/Users/danilo.santos/Documents/Projetos/code-connect/node_modules/@prisma/client/runtime/library.js:121:6347)
    at async l (/Users/danilo.santos/Documents/Projetos/code-connect/node_modules/@prisma/client/runtime/library.js:130:9616)
    at async /Users/danilo.santos/Documents/Projetos/code-connect/prisma/seed.js:119:7 {
  clientVersion: '6.1.0'
}

Node.js v20.11.1

An error occurred while running the seed command:
Error: Command failed with exit code 1: node prisma/seed.js

Não consigo avançar no exercicio, poderia me ajudar?? Desde já agradeço.

Este é o seed.js que estou tentando executar.

const { PrismaClient } = require('@prisma/client')
const prisma = new PrismaClient()

async function main() {

  const author = {
    name: "Ana Beatriz",
    username: "anabeatriz_dev",
    avatar: "https://raw.githubusercontent.com/viniciosneves/code-connect-assets/main/authors/anabeatriz_dev.png",
  };
  
  const ana = await prisma.user.upsert({
      where: {username: author.username},
      update: {},
      create: author,
  })
  console.log('Author created', ana)

  const posts = [
      {
        "cover": "https://raw.githubusercontent.com/viniciosneves/code-connect-assets/main/posts/introducao-ao-react.png",
        "title": "Introdução ao React",
        "slug": "introducao-ao-react",
        "body": "Neste post, vamos explorar os conceitos básicos do React, uma biblioteca JavaScript para construir interfaces de usuário. Vamos cobrir componentes, JSX e estados.",
        "markdown": "```javascript\nfunction HelloComponent() {\n  return <h1>Hello, world!</h1>;\n}\n```",
        "authorId": ana.id
      }
    ];   

    posts.forEach(async (post) => {
      await prisma.post.upsert({
        where: { slug: post.slug },
        update: {},
        create:post
      })
    })
}
console.log('Seed OK')

main()
    .then(async () => {
        await prisma.$disconnect()
    })
    .catch(async (e) => {
        console.error(e)
        await prisma.$disconnect()
        process.exit(1)
    })
2 respostas
solução!

Oi Danilo,

O erro que você está enfrentando ocorre porque o método upsert do Prisma, quando usado com where, exige que você forneça um identificador único para a busca, como o id.

No seu caso, você está usando o slug no where, o que não é suficiente para o Prisma identificar um registro único para atualizar ou criar. 💡

Para corrigir, você pode adicionar um id no seu where ou usar o slug para buscar o registro e, caso não exista, criar um novo. Veja como você pode ajustar seu código:

posts.forEach(async (post) => {
  await prisma.post.upsert({
    where: { 
      slug: post.slug,
    },
    update: post,
    create: post,
  });
});

Nessa versão, o upsert tentará encontrar um post com o slug fornecido. Se encontrar, ele atualizará o registro com os dados do post. Caso contrário, ele criará um novo registro com os dados do post. 👍

Além disso, o seu código está executando as operações de upsert dentro de um forEach com async/await, o que pode não ser o ideal para operações em massa.

Para garantir que todas as operações sejam concluídas antes de prosseguir, você pode usar Promise.all com map para executar as operações em paralelo:

await Promise.all(
  posts.map(async (post) => {
    await prisma.post.upsert({
      where: { 
        slug: post.slug,
      },
      update: post,
      create: post,
    });
  })
);

Essa abordagem garante que todas as operações de upsert sejam concluídas antes que o script termine. 📋

Para saber mais: Documentação oficial do Prisma sobre upsert. Este link leva à documentação oficial do Prisma, onde você pode encontrar mais detalhes sobre o método upsert e suas opções.

Continue praticando e explorando as funcionalidades do Prisma! 🤔

Obrigado Luis!!