Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
April 7, 2022 03:03 pm GMT

ORM - Interface com o Banco de Dados

Tabela de Contedos

  • ORM
  • Mapeamentos
  • Sequelize
  • Model
  • Migration
  • Seeders
  • Operations
  • Links teis

ORM

O que ?

Object Relational Mapper, ou em portugus, Mapeamento Objeto-Relacional, uma tcnica que permite realizar o mapeamento estrutural entre as entidades do DB, os representando atravs de objetos JS.

Por que usar?

Como j vimos anteriormente, podemos realizar consultas e manipulaes no servidor atravs de Queries SQL, porm em aplicaes mais complexas isso se torna insustentvel.

Imagine um cenrio onde temos 10 tabelas, com 6 colunas cada, para inserir dados manualmente j seria uma tarefa "rdua", porm se pensarmos que cada tabela possui ao menos um relacionamento, essa tarefa j se torna extremamente complexa e sujeita a erros.

As ferramentas de ORM surgem justamente para simplificar e garantir maior segurana durante a integrao entre a API e o Banco de Dados.

ORMs

  • Sequelize: ser abordada mais frente.
  • Prisma: no ser abordado aqui, porm vale a pena dar uma olhada.

Voltar ao topo

Mapeamentos

O que so?

So padres que seguimos ao mapear uma entidade de um DB.

Quais so?

Existem dois padres de maior adoo, sendo eles o Data Mapper e o Active Record, ambos possuem suas prprias peculiaridades.

Data Mapper

Esse padro pede que a classe que representa a entidade no conhea os recursos necessrios para realizar uma operao no DB, sendo assim temos que ter uma camada intermediria responsvel pelas operaes.

Com o padro Data Mapper conseguimos ter a entidade mapeada (classe) completamente desacoplada do DB, sendo necessrio refatorar apenas o Mapeador da entidade, que seria a camada intermediria.

Active Record

Diferente do padro mostrado acima, o Active Record centraliza todos os recursos na entidade mapeada, dessa forma nossa classe est diretamente acoplada ao DB, no sendo necessrio criar uma camada intermediria.

A vantagem desse padro o desenvolvimento mais simples e rpido, comparado ao Data Mapper, porm por ter todos os recursos centralizados sua manuteno tende a ficar mais complexa conforme o projeto cresce

Voltar ao topo

Sequelize

O que ?

uma ferramenta ORM que segue o padro de arquitetura Active Record para realizar o mapeamento das entidades.

O que faz?

Como dito na definio de ORM, o Sequelize facilita a conexo entre API e DB, permitindo que realizemos operaes dentro do DB sem utilizar Queries SQL, apenas usando JS.

Implementando

Para implementarmos essa ferramenta precisamos seguir um passo a passo relativamente extenso.

  1. Instalao
  2. Inicializao
  3. Conexo com o DB
  4. Criao do Model, Seeds e Transactions
  5. Criao das Migrations
  6. Criao dos Operators

Voltar ao topo

Model

O que ?

Tanto na arquitetura MSC, quanto no Sequelize, a Model a camada na qual iremos realizar a conexo entre a API e o DB.

Estrutura de Diretrios

Aps iniciarmos nosso projeto atravs do Sequelize-Cli, um diretrio chamado models ser criado, dentro dele haver um index.js, o qual no iremos mexer, ele o responsvel por estabelecer uma instncia de conexo entre os arquivos de models/ e o DB.

Criando models

Temos duas formas de criarmos Models, podemos utilizar do Sequelize-Cli, dessa forma no s a Model ser gerada, mas a Migration tambm. Ou podemos fazer manualmente, criando um novo arquivo no diretrio models/ criado anteriormente atravs do npx sequelize init.

Sequelize-Cli

Para criarmos novas Models utilizando o Sequelize-Cli, iremos utilizar o comando prprio para isso (exemplificado logo abaixo) e passar o nome e os atributos que esse Model precisar.

Ao criamos uma nova Model atravs desse comando ela ser criada como uma classe, ento se ainda no estiver acostumado a Orientao a Objeto, criar a Model manualmente talvez seja uma opo melhor.

npx sequelize model:generate --name <nome da tabela> --attributes <atributo: tipo>
npx sequelize model:generate --name User --attributes fullName:string

* Vale dizer que no precisamos passar todos os atributos atravs de comando, podemos adicion-los depois diretamente no arquivo gerado.

Manualmente

A Model pode ser criada manualmente, pois ela no possui nenhum tipo de identificador em seu nome de arquivo, logo a nica coisa que precisamos fazer criar um novo arquivo JS no diretrio models/.

Sintaxe

Aps ter criado o arquivo dentro da pasta models/, gerada pelo Sequelize-Cli, com o arquivo criado ns iremos utilizar o sequelize.define, que basicamente um mtodo que ns permite definir Models atravs de uma funo ao invs de uma classe.

Como parmetro do mtodo .define() iremos primeiro passar o nome da tabela e em seguida modelar a entidade, essa modelagem consiste em definir as colunas presentes em uma entidade, bem como seu tipo e restries.

const /*nome da Model*/ = (sequelize, DataTypes) => {  return sequelize.define(/*nome da Model*/, {    /* nome do campo */: /* tipo do campo */,    /* nome do campo */: /* tipo do campo */,    /* nome do campo */: /* tipo do campo */,  });};module.exports = /*Model*/;
const Person = (sequelize, DataTypes) => {  return sequelize.define('Person', {    id: DataTypes.INTEGER,  // <- O id  opcional, pois o Sequelize o ir definir por padro    firstName: DataTypes.STRING,    lastName: DataTypes.STRING,    age: DataTypes.INTEGER,    /* ---------------------------- */    // Assim como o id, os campos createdAt e updatedAt so opcionais    // e sero criados pelo Sequelize por padro.    createdAt: DataTypes.DATE,    updatedAt: DataTypes.DATE,    /* ---------------------------- */  });};module.exports = Person;

Voltar ao topo

Migration

O que ?

a forma de "versionar" nosso DB, onde cada arquivo ir conter um pedao de cdigo que ir representar o histrico de alteraes. Cada Migration deve saber exatamente quais alteraes executar, para criar uma verso e restaurar verses anteriores.

Estrutura de Diretrios

Todas as nossas Migrations iro ficar dentro do diretrio migrations/, sendo que se utilizamos o comando do Sequelize-Cli para criarmos a Model a Migration ter sido criada junto.

Criando migrations

As Migrations podem ser criadas de duas formas, podem ser criadas junto das Models, caso tenhamos o Sequelize-Cli para a criao das Models ou atravs do Sequelize-Cli.

Junto das Models

Ao criamos uma Model atravs do Sequelize-Cli uma Migration ser gerada automaticamente, porm ela s ter os atributos definidos no comando executado, ou seja, se modificamos algo na Model aps sua criao, ser necessrio fazer essa mesma modificao na Migration.

Sequelize-Cli

Para criarmos novas Migrations para uma tabela j existente, ou at mesmo gerar a primeira migration podemos usar um comando do Sequelize-Cli prprio para isso:

npx sequelize migration:generate --name <nome da nova migration>
npx sequelize migration:generate --name add-column-phone-table-users

A estrutura gerada ser assim:

Referncia oficial

module.exports = {  up: (queryInterface, Sequelize) => {    // logic for transforming into the new state  },  down: (queryInterface, Sequelize) => {    // logic for reverting the changes  }}

Sintaxe

A sintaxe da Migration bem voltil, at porque ir mudar de acordo com o que desejarmos fazer no DB, a nica constante a utilizao dos mtodos da queryInterface.

Esses mtodos so os responsveis por interagir diretamente com o DB, podendo gerar/dropar tabelas, adicionar/excluir colunas, bem como executar Queries SQL puras.

// o exemplo genrico abaixo foca na criao e deleo de uma tabela.module.exports = {  async up(queryInterface, Sequelize) {    await queryInterface.createTable(/* nome da tabela */, {      /* nome do campo */: {        /* opo do campo */: /* configurao */,        /* opo do campo */: /* configurao */,        /* opo do campo */: /* configurao */,      },      /* nome do campo */: {        /* opo do campo */: /* configurao */,        /* opo do campo */: /* configurao */,      },      /* nome do campo */: {        /* opo do campo */: /* configurao */,        /* opo do campo */: /* configurao */,      },      /* nome do campo */: /* tipo do campo */,    });  },  async down(queryInterface, Sequelize) {    await queryInterface.dropTable(/* nome da tabela */);  },}
// os mtodos da queryInterface so assncronos, ento uma opo  utilizar async/awaitmodule.exports = {  async up(queryInterface, Sequelize) {    await queryInterface.createTable('Persons', {  // criao da tabela Persons      id: {        type: Sequelize.INTEGER,        primaryKey: true,        autoIncrement: true,      },      firstName: {        type: Sequelize.STRING,        allowNull: false,      },      lastName: {        type: Sequelize.STRING,        allowNull: false,      },      age: {        Sequelize.INTEGER,        allowNull: false,      },      createdAt: {        type: Sequelize.DATE,        allowNull: false,      },      updatedAt: {        type: Sequelize.DATE,        allowNull: false,      },    });  },  async down(queryInterface, Sequelize) {    await queryInterface.dropTable('Persons');  // deleo da tabela Persons  },}

Para saber quais mtodos podem ser usados na queryInterface consulte a documentao.

Executando a Migration

Aps criar a Migration e realizar as configuraes necessrias, precisamos execut-la para que as tabelas sejam criadas em nosso DB.

npx sequelize db:migrate

Voltar ao topo

Seeders

O que ?

uma forma de povoar o DB para o funcionamento mnimo da aplicao.

Estrutura de Diretrio

Nossos arquivos de povoamento iro ficar no diretrio seeders/ e assim como as Migrations, os Seeders devero conter cdigo para realizar e desfazer alteraes.

Criando seeders

Os Seeders devem ser criados a partir do Sequelize-Cli, isso porque os arquivos contm um timestamp em seu nome, ento para evitar erros, o mais seguro cri-los via linha de comando.

Sequelize-Cli

Para criar um Seeder via CLI tudo que precisamos fazer executar o respectivo comando do Sequelize-Cli.

npx sequelize seed:generate --name # nome do seeders
npx sequelize seed:generate --name users

A estrutura criada ser:

'use strict';module.exports = {  async up (queryInterface, Sequelize) {    /**     * Add seed commands here.     *     * Example:     * await queryInterface.bulkInsert('People', [{     *   name: 'John Doe',     *   isBetaMember: false     * }], {});    */  },  async down (queryInterface, Sequelize) {    /**     * Add commands to revert seed here.     *     * Example:     * await queryInterface.bulkDelete('People', null, {});     */  }};

Sintaxe

Para definirmos os dados a serem criados utilizamos a queryInterface juntamente do mtodo bulkInsert, esse que ir receber o nome da tabela como primeiro parmetro e os dados a serem inseridos como um Array no segundo parmetro.

J para deletar os dados utilizamos o mtodo bulkDelete, esse que ir receber o nome da tabela e as opes de deleo, respectivamente, como parmetros. Se quisermos deletar todos os dados, passamos null como segundo parmetro.

'use strict';module.exports = {  up: async (queryInterface, Sequelize) => queryInterface.bulkInsert('Persons',    [      {        firstName: 'John'        lastName: 'Doe',        email: '[email protected]',        createdAt: Sequelize.literal('CURRENT_TIMESTAMP'),        updatedAt: Sequelize.literal('CURRENT_TIMESTAMP'),        // para criar as datas no SQL utilizamos o literal('CURRENT_TIMESTAMP')      },      {        firstName: 'Joseph'        lastName: 'Clinton',        email: '[email protected]',        createdAt: Sequelize.literal('CURRENT_TIMESTAMP'),        updatedAt: Sequelize.literal('CURRENT_TIMESTAMP'),      },    ]),  down: async (queryInterface) => queryInterface.bulkDelete('Persons', null, {}),};

Executando

Com o Seeders criados podemos popular nosso DB, para isso podemos executar os seguintes comandos

npx sequelize db:seed:all  # ir executar todos os nossos seeders
npx sequelize db:seed:undo:all  # ir reverter todos os nossos seeders

Voltar ao topo

Operations

O que so?

So as formas pelas quais iremos interagir com a nossa camada Model.

Como fazer?

Diferente de quando realizamos uma conexo direta com o DB, quando utilizamos o Sequelize ns no precisamos utilizar Queries SQL, basta utilizarmos os mtodos disponibilizados pela prpria ferramenta.

* Existem casos onde ser necessrio utilizar Queries SQL junto do Sequelize, mas so raros.

Onde fazer?

Isso ir depender da arquitetura escolhida, por exemplo, caso optemos por seguir o padro MSC, ento nossas operaes deve ser feitas na camada de Service.

Lista de operaes

As operaes mais comuns so:

  // recupera todas as entidades de determinada tabelaModel.findAll();
// recupera uma entidade de determinada tabela de acordo com a Primary keyModel.findByPk();
// cria uma nova entidade em determinada tabelaModel.create();
// exclui uma ou mais entidades de acordo com as configuraes definidasModel.destroy();

Voltar ao topo

Links teis

Models

Migrations

Seeders

Operations

Voltar ao topo


Original Link: https://dev.to/gabrielhsilvestre/orm-interface-com-o-banco-de-dados-3am1

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To