Ir para o conteúdo PET Sistemas de Informação Ir para o menu PET Sistemas de Informação Ir para a busca no site PET Sistemas de Informação Ir para o rodapé PET Sistemas de Informação
  • International
  • Acessibilidade
  • Sítios da UFSM
  • Área restrita

Aviso de Conectividade Saber Mais

Início do conteúdo

ORM



O que é e para que serve um ORM?

 

    Object-Relational Mapping (ORM), em português, mapeamento objeto-relacional, é uma técnica para aproximar o paradigma de desenvolvimento de aplicações orientadas a objetos ao paradigma do banco de dados relacional. O uso da técnica de mapeamento objeto-relacional é realizado através de um mapeador objeto-relacional que geralmente é a biblioteca ou framework que ajuda no mapeamento e uso do banco de dados.

Por que usar um ORM?

    Quando usamos o paradigma orientado a objetos trabalhamos principalmente com classes e é claro objetos, que por sua vez representam algo do mundo real, seja algo concreto ou abstrato, como por exemplo:

 

const produto = {

    id: 1,

    nome: ‘bicicleta’,

    preco: 800,

    descricao: ‘engrenagem fixa, azul, rápida’,

}

 

    O banco de dados relacional trabalha com tabelas e relações entre elas para representar modelos da vida real. Dentro das tabelas temos várias colunas e a unidade que temos para representação no modelo relacional é uma linha:

  

id

nome

preco

descricao

1

bicicleta

800

engrenagem fixa, azul, rápida

2

capacete

20.5

preto, ajustável

3

uniforme

35

pequeno, verde e branco

As principais dificuldades que essas diferenças entre paradigmas causa:

  • Representação dos dados e do modelo, já que as estruturas são distintas;

  • Mapeamento entre os tipos de dados da linguagem de programação e do banco de dados;

  • Modelo de integridade relacional do banco relacional;

Outra grande vantagem em utilizar um ORM para representar esta relação entre banco de dados e objetos é que bons ORMs implementam várias questões de segurança buscando evitar ataques comuns, como SQL Injection, CSRF, Session Hijacking, Replay Attack, entre outros. Na prática o que o ORM faz é uma “sanitização” dos dados enviados ao banco de dados, o que consequentemente resulta em um ganho de tempo pelos programadores.

Padrões usados no mercado

    Martin Fowler em seu livro “Padrões de Arquitetura de Aplicações Corporativas” relata dois principais padrões utilizados pela indústrias, sendo eles:

 

  • Data Mapper: Neste padrão a classe que representa a entidade (tabela) no banco de dados não deve conhecer os métodos de inserção, busca, atualização e exclusão, estas operações são feitas através de uma classe própria do ORM, deste modo garantindo que as classes que representam as tabelas tenham uma única responsabilidade, este é o padrão mais usado e será demonstrado em um exemplo logo mais.

  • Active Record: Neste caso a classe conhece os métodos básicos para se relacionar com o banco de dados, estes métodos são herdados de uma classe do ORM, na prática é feito apenas uma nova instância do objeto desejado e eles já possuem todos os métodos por herança. 

Exemplo usando Prisma ORM

 

    O Prisma é um ORM NodeJS que consiste em três ferramentas principais:

 

  • Prisma Client: um construtor de consultas gerado automaticamente e fortemente tipado para o Node.js e o TypeScript.

  • Prisma Migrate: um sistema declarativo de modelagem e migração de dados.

  • Prisma Studio: uma GUI para visualizar e editar dados em seu banco de dados.

    Embora o Prisma tenha muitas funcionalidades legais, como uma integração com Typescript automática, geração de migrations automática e um SGBD próprio, o objetivo principal desta redação é usá-lo para exemplificar alguns conceitos comuns que muitos ORMs possuem e não ser um tutorial de Prisma em si.

Mapeamento de dados

    

    No exemplo abaixo, datasource e generator são entidades de configuração, além disso criamos dois models, Post e User que representam entidades do nosso banco de dados, note que as relações entre tabelas são criadas no próprio model, como no campo posts do model User, campos obrigatórios ou não são definidos pelo marcados “?”, este é só um exemplo de como os ORMs mapeam as entidades do banco de dados em objetos na aplicação.

datasource db {

  provider = “postgresql”

  url      = env(“DATABASE_URL”)

}

generator client {

  provider = “prisma-client-js”

}

model Post {

  id        Int     @id @default(autoincrement())

  title     String

  content   String?

  published Boolean @default(false)

  author    User?   @relation(fields: [authorId], references: [id])

  authorId  Int?

}

model User {

  id    Int     @id @default(autoincrement())

  email String  @unique

  name  String?

  posts Post[]

}

 

    Para manipular os dados, normalmente usamos algo como: 


import { PrismaClient } from ‘@prisma/client’

const prisma = new PrismaClient()

// busca todos os usuários com posts

const allUsers = await prisma.user.findMany({

  include: { posts: true },

})

// cria um usuário e um post juntos

const user = await prisma.user.create({

 data: {

   name: ‘Alice’,

   email: ‘alice@prisma.io’,

   posts: {

     create: { title: ‘Join us for Prisma Day 2020’ },

   },

 },

})

 

Migrations

 

    No Prisma os models estão contidos no arquivo prisma.schema, as migrations fazem a sincronização de tudo contigo neste arquivo, o processo normalmente ocorre da seguinte forma:

 

  1. O comando prisma migrate dev –name init cria uma nova migrate, que nada mais é que um arquivo .sql com os comandos realizados pelo ORM, neste primeiro caso alguns create table, a estrutura de pastas é bem simples.

migrations/

 └─ 20210313140442_init/

   └─ migration.sql

 

  1. Agora vamos supor que o model de User foi alterado e a coluna “jobTitle String” foi adicionada.

  2. Deste modo é necessário criar uma nova migrate usando o mesmo comando, que neste caso gera um arquivo .sql que é um alter table.

prisma migrate dev –name added_job_title.

  1. Por fim, a estrutura de pastas, que também serve com um histórico de alterações do banco de dados, fica da seguinte forma.

migrations/

 └─ 20210313140442_init/

   └─ migration.sql

 └─ 20210313140442_added_job_title/

   └─ migration.sql

    Esta ferramenta além de manter seu banco sincronizado de forma simples, facilita muito o processo de compartilhamento de dados entre um time com mais pessoas, toda e qualquer alteração no banco de dados é bem documentada no código e facilita o entendimento do mesmo.

 

Referências

Para saber mais sobre o Prisma ORM, acesse: https://www.prisma.io/docs/getting-started

Martin Fowler. Patterns of Enterprise Application Architecture, Addison-Wesley, 2002.

Divulgue este conteúdo:
https://ufsm.br/r-791-3299

Publicações Relacionadas

Publicações Recentes