ORM para JavaScript (Node.js): comparação e exemplos
No desenvolvimento de aplicações server-side com Node.js, a interação com o banco de dados é uma das tarefas principais. O Object-Relational Mapping (ORM) permite trabalhar com bancos de dados relacionais através de objetos JavaScript, eliminando a necessidade de escrever SQL puro. Neste artigo, analisaremos três ORMs populares: Sequelize, TypeORM e Prisma, compararemos suas características e apresentaremos exemplos práticos.
1. Sequelize
Sequelize é uma das ORMs mais antigas e maduras para Node.js. Suporta PostgreSQL, MySQL, MariaDB, SQLite e MSSQL. Funciona com promises e async/await.
Instalação e configuração
npm install sequelize sequelize-clinpm install pg pg-hstore # para PostgreSQLExemplo de modelo e consultas
const { Sequelize, DataTypes } = require('sequelize');const sequelize = new Sequelize('postgres://user:pass@localhost:5432/mydb');
// Definição do modeloconst User = sequelize.define('User', { name: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, unique: true }});
// Criar registroconst user = await User.create({ name: 'Ivan', email: 'ivan@example.com' });
// Buscar com filtroconst users = await User.findAll({ where: { name: 'Ivan' } });
// Atualizarawait User.update({ email: 'new@example.com' }, { where: { id: 1 } });Prós e contras
- + Grande comunidade, muita documentação
- + Suporte a migrações e seeds
- - Sintaxe verbosa para consultas complexas
- - Sem suporte nativo a TypeScript
2. TypeORM
TypeORM é uma ORM voltada para TypeScript, mas também funciona com JavaScript comum. Suporta decoradores, Active Record e Data Mapper. Funciona com a maioria dos SGBDs populares.
Instalação e configuração
npm install typeorm reflect-metadatanpm install pg # para PostgreSQLExemplo de modelo com decoradores
import { Entity, PrimaryGeneratedColumn, Column, createConnection } from 'typeorm';
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column({ unique: true }) email: string;}
// Usoconst connection = await createConnection();const userRepo = connection.getRepository(User);const user = await userRepo.save({ name: 'Ana', email: 'anna@example.com' });const users = await userRepo.find({ where: { name: 'Ana' } });Prós e contras
- + Excelente suporte a TypeScript
- + Duas abordagens: Active Record e Data Mapper
- - Configuração complexa para iniciantes
- - Migrações lentas em projetos grandes
3. Prisma
Prisma é uma ORM moderna que utiliza sua própria linguagem de esquema e gera um cliente type-safe. É considerada a mais performática e amigável para desenvolvedores.
Instalação e configuração
npm install @prisma/clientnpx prisma initDefinição do esquema (schema.prisma)
model User { id Int @id @default(autoincrement()) name String email String @unique}Exemplo de consultas
import { PrismaClient } from '@prisma/client';const prisma = new PrismaClient();
// Criarconst user = await prisma.user.create({ data: { name: 'Olga', email: 'olga@example.com' }});
// Buscarconst users = await prisma.user.findMany({ where: { name: 'Olga' } });
// Atualizarawait prisma.user.update({ where: { id: 1 }, data: { email: 'new@example.com' }});Prós e contras
- + Type-safety completo