Primeiras aulas do curso ORM com NodeJS: avançando nas funcionalidades do Sequelize

ORM com NodeJS: avançando nas funcionalidades do Sequelize

Soft delete (exclusão suave) - Introdução

Olá. Boas-vindas ao segundo curso de Sequelize da formação de NodeJS da Alura. Esse curso continua imediatamente de onde paramos o Curso 1, mas o foco agora é avançar em algumas funcionalidades do Sequelize e também organizar melhor nossa aplicação. Vamos lendo o CRUD básico e vamos trabalhar com algumas ferramentas do Sequelize que vão ajudar a resolver alguns requisitos específicos de um projeto.

O que vamos aprender? Mais ferramentas do Sequelize e como utilizá-las, vamos entender como o Sequelize traduz ferramentas do SQL, e como conseguimos usar isso para atender necessidades específicas de um projeto que vão além do CRUD básico.

Como usamos o Sequelize para manter e garantir a integridade dos dados que estão sendo movimentados no banco. Isso é super importante, e como organizar melhor uma aplicação à medida que ela cresce em complexidade, indo além das camadas básicas do MVC.

Se você ainda não conhece o Sequelize, é legal que você faça o primeiro curso para entender o que essa ferramenta faz, como ela funciona, como ela se conecta com SQL e etc, porque não vamos abordar isso durante o curso. Se você já teve contato com SQL e já sabe como ele funciona e quer avançar, você pode continuar o projeto de onde ele parou, vamos dar o link para você baixar e as instruções para instalação.

No final deste curso você já vai ter visto uma boa quantidade de soluções que o Sequelize traz para o seu back-end, para o seu produto, para você gerar APIs rest, e também como implementar funcionalidades a mais em um projeto de acordo com a sua necessidade. Eu sou a Juliana Amoasei, vou estar com você durante este curso, então vamos começar.

Soft delete (exclusão suave) - Atualizando o projeto

Para este curso já temos um projeto encaminhado. Vou deixar um link para vocês baixarem ele do zero, mas se você está emendando este curso no curso anterior de Sequelize você pode continuar do mesmo projeto. As únicas alterações que foram feitas aqui são esse arquivo requisitos.md, que é onde eu incluí os requisitos que vamos trabalhar durante este curso que estamos trabalhando agora, e também foi adicionado um linter para fazer a checagem de estilo do código.

Se você nunca usou linter não tem problema, ele só está aqui para ver se a endentação está certa, se tem ponto e vírgula, essas coisas. Não vai fazer diferença no Sequelize, no banco de dados, nada.

Vamos dar uma olhada no projeto atual. Por enquanto temos uma API que reflete esse diagrama de banco que recebemos anteriormente no Curso 1. A partir desse diagrama montamos modelo, controladores, rotas, podemos até dar uma olhada.

Os modelos foram criados a partir do Sequelize, ele tem recursos e ferramentas para criar esses modelos automaticamente. Os controladores criamos, também as rotas para testar, tudo isso, está tudo funcionando, o CRUD básico que fizemos no curso 1, e o cliente pode utilizar o sistema.

Se viermos no Postman, nas rotas que fizemos no curso anterior e que estão disponíveis neste projeto, estão todas funcionando na porta 3000. Está tudo ok. O que acontece? Depois de um tempo, o cliente percebeu que algumas funcionalidades não tinham e ele precisava. O que vamos fazer neste curso é implementar essas funcionalidades que coloquei no arquivo requisitos.md.

Mas antes de começar realmente a trabalhar com isso vamos ter que lidar com uma coisa que aconteceu justamente entre o projeto anterior do curso 1 e esse aqui. O pessoal que desenvolve o Sequelize lançou uma atualização de versão. A versão que temos no nosso projeto é a 5.21, mas se viermos na documentação do Sequelize ele foi atualizado para a versão 6.

Até aí tudo bem, vamos fazer o que fazemos nesses casos, damos uma olhada no registro de modificações, no change log, isso é normal, toda documentação de ferramenta tem para dizer “dessa versão atualizamos tal coisa”, e vemos se tem alguma mudança importante que impacta no nosso projeto, porque sempre pode acontecer de alguns métodos serem descontinuados, e se atualizamos nosso projeto fica quebrado.

Se você está começando agora, está baixando o projeto do zero lá no link que vamos disponibilizar, não vai ter que se preocupar com isso, porque já vai vir ele todo atualizado.

No caso aqui da documentação do Sequelize, do registro de mudanças, já me adiantei e vi que o método sequelize.import foi removido. Esse método está sendo usado no projeto que tem para começar somente em um arquivo, que é o arquivomodels/index.js. Esse arquivo é um arquivo que o Sequelize cria automaticamente para gerenciarmos os modelos.

Ele criou isso para nós lá no início do projeto anterior. Vamos atualizar nosso projeto agora para a versão 6 para sempre trabalharmos com a versão mais recente, e já corrigimos esse problema.

Se viermos no terminal e digitarmos no terminal ‘npm outdated’ ele vai mostrar para nós que o Sequelize não está atualizado, e nem o sequelize-cli, que é a ferramenta de linha de comando do Sequelize. O que vamos fazer? Vou no package JSON, vou abrir o arquivo, atualizo a dependência do Sequelize de 5.21.7 para 6.3.0, que é a última versão até o momento em que este curso está sendo gravado. E o sequelize-cli vou atualizar também para a versão 6.2.0, que também é a última versão no momento em que estamos gravando este vídeo.

Se voltarmos no terminal agora e atualizarmos tudo com ‘npm update’, ele vai atualizar, vai demorar um pouco talvez, costuma ser rápido. Olha que interessante que aconteceu. Eu estava já com o projeto rodando, e o nodemon já percebeu, que ele vai vendo e escutando as alterações imediatamente, e percebeu que tem uma linha, justamente a linha que usa o import, que quebrou.

Aqui é onde vamos ter que consertar. Como eu já tinha dado uma olhada na documentação, eu já tinha visto onde temos que arrumar essa linha com import que está com problema. Só vamos trocar essa linha, vamos trocar onde está o sequelize.import por um código um pouco diferente, que vai ser um require(*path*.join(dirname, file))(sequelize, Sequelize.DataTypes).

Agora eu salvei o arquivo. Se voltarmos no terminator, pronto, ele já está rodando. Já consertou onde estava quebrado. Como atualizamos também o sequelize-cli para a versão 6, da próxima vez que você precisar criar qualquer coisa com o sequelize-cli, usar a linha de comando, essa linha de comando também vai estar atualizada, corrigida. Agora o servidor já voltou a rodar normalmente. Projeto revisado, atualizado. Agora podemos realmente começar a mexer no código.

Soft delete (exclusão suave) - Ocultando sem deletar

Temos uma lista com alguns requisitos que o cliente passou para nós. Vamos dar uma olhada neles e começar pelo primeiro. O cliente não gostaria que registros importantes do sistema, como por exemplo pessoas, sejam apagados definitivamente do banco de dados.

Ou seja, apagar um registro do banco de dados é uma operação permanente e o cliente quer que isso não aconteça. Como fazemos para que um registro não seja verdadeiramente excluído do banco, mas mantendo para o usuário essa funcionalidade? Ou seja, o usuário continua achando que está apagando, mas o registro fica lá.

Vamos aqui no terminal abrir o terminal do MYSQL, com MYSQL, meu usuário, minha senha de banco local. Estou usando o terminal do MYSQL, mas se você quiser usar um cliente, por exemplo MYSQL work bench ou The beaver, fique à vontade, que só vamos usar para consultar mesmo, então não vai fazer diferença você usar um cliente ou um terminal, etc.

Vamos dar uma olhada então. Vou entrar no banco de dados que estamos usando, o escola_ingles, e vou dar um select para vermos como estão nossas tabelas. Vou dar um select all from pessoas para dar uma olhada. Nós populamos no curso anterior a tabela e ela tem essas colunas.

Teríamos que dar um jeito de marcar os registros que queremos apagar com uma espécie de bandeira, para que o sistema pense que esses registros estão deletados, mas ele não é apagado do banco, sem que a linha seja apagada do banco, lembrando que apagar uma coisa do banco é uma ação permanente.

Esse recurso existe em SQL, e o Sequelize traz para nós também. Ele é chamado de exclusão suave, ou soft delete. Vamos dar uma olhada na documentação do Sequelize.

No Sequelize essa opção chama paranoid. Conseguimos fazer a exclusão suave via Sequelize com relativamente poucas linhas. Ele está dando na documentação. Quando utilizamos um modelo, os modelos do sequelize têm um objeto onde colocamos os atributos e outro objeto onde vamos colocar a opção paranoid true.

Vou copiar a linha. Essa opção é definida nos modelos, então podemos vir no nosso código, nos modelos. Vou colocar não só em pessoas, vou colocar essa opção para todos os modelos, porque temos poucas tabelas, então não tem problema.

Aqui está como na documentação, o primeiro objeto são os atributos da tabela, da linha 3 até a linha 5, e o sequelize deixou até para nós um objeto vazio para colocar as opções. É aqui que vou colocar o paranoid true. Coloquei a opção na tabela matrículas, e vou colocar nas outras também, no modelo níveis, no modelo pessoas, e no modelo turmas.

Enquanto o valor de paranoid for true, garantimos que nenhum registro da tabela vai ser verdadeiramente deletado. O Sequelize vai ser avisado quando tentar excluir qualquer registro.

E como o paranoid funciona? Vamos voltar na documentação. A documentação diz que essa opção, vou descer um pouco nas informações que tem na documentação, quando usamos paranoid true, ao invés de deletar, de usar a palavra-chave delete quando o sequelize monta a query de SQL, vai usar um update. Não é mais delete, vamos continuar usando o método sequelize destroy, porém o que vai ser feito na query? Vai ser feito um update e aí o que vai acontecer?

A query vai adicionar um timestamp numa coluna que chama deletedAt. Deletado em. Não temos uma coluna, se voltarmos no terminal do MYSQL, deletedAt, que ele precisa para fazer o paranoid funcionar. Temos que criar essa coluna para conseguir implementar o soft delete, porque da próxima vez que usarmos o destroyvai ser feito um update, colocado um timestamp no registro nessa coluna e o sequelize vai puxar como registro ativo só o que não tiver nenhum timestamp nessa coluna. Vamos ver isso um pouco mais para frente.

Mas primeiro precisamos adicionar essa coluna deletedAt em todas as nossas tabelas. Já usamos o sequelize para adicionar colunas através dos arquivos de migração. Vamos abrir as migrações. Usamos cada uma delas para conectar com o banco e criar as tabelas com o método create table, tem os atributos id, etc, 0, updatedAt.

Conseguimos usar o sequelize para depois você criar uma tabela, cada uma delas, conseguimos adicionar colunas também usando o Sequelize? Vamos ver isso agora em seguida.

Sobre o curso ORM com NodeJS: avançando nas funcionalidades do Sequelize

O curso ORM com NodeJS: avançando nas funcionalidades do Sequelize possui 167 minutos de vídeos, em um total de 50 atividades. Gostou? Conheça nossos outros cursos de Node.JS em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Node.JS acessando integralmente esse e outros cursos, comece hoje!

Plus

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$85
à vista R$1.020
Matricule-se

Pro

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas