An Interest In:
Web News this Week
- April 27, 2024
- April 26, 2024
- April 25, 2024
- April 24, 2024
- April 23, 2024
- April 22, 2024
- April 21, 2024
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.
- Instalao
- Inicializao
- Conexo com o DB
- Criao do Model, Seeds e Transactions
- Criao das Migrations
- 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
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To