ORM para JavaScript (Node.js): comparação e exemplos
No desenvolvimento do lado servidor com Node.js, mais cedo ou mais tarde surge a questão da interação com o banco de dados. Escrever consultas SQL puras é uma tarefa trabalhosa e sujeita a erros. Para ajudar, existem os ORMs (Object-Relational Mapping) — bibliotecas que permitem trabalhar com tabelas de banco de dados como se fossem objetos JavaScript comuns. Neste artigo, compararemos os três ORMs mais populares para Node.js: Sequelize, TypeORM e Prisma, e apresentaremos exemplos de código ilustrativos.
1. Sequelize
Sequelize é um dos ORMs mais antigos e maduros para Node.js. Ele suporta PostgreSQL, MySQL, MariaDB, SQLite e Microsoft SQL Server. O Sequelize usa uma abordagem clássica com modelos e promessas (ou async/await).
Instalação
npm install sequelize pg pg-hstoreExemplo: definição de modelo e consulta
const { Sequelize, DataTypes } = require('sequelize');const sequelize = new Sequelize('database', 'user', 'password', { host: 'localhost', dialect: 'postgres'});
const User = sequelize.define('User', { name: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, unique: true }});
async function createUser() { await sequelize.sync(); const user = await User.create({ name: 'Ivan', email: 'ivan@example.com' }); console.log(user.toJSON());}createUser();Características do Sequelize
- Maturidade e grande comunidade.
- Suporte a transações, migrações e dados de seed.
- Sistema flexível de associações (hasOne, hasMany, belongsToMany).
- Desvantagem: sintaxe por vezes verbosa e depuração complexa.
2. TypeORM
TypeORM é um ORM que pode funcionar tanto com JavaScript quanto com TypeScript. Ele suporta os mesmos SGBDs que o Sequelize e oferece duas abordagens: Active Record e Data Mapper. O TypeORM também usa ativamente decoradores, tornando o código mais declarativo.
Instalação
npm install typeorm reflect-metadata pgExemplo: modelo com decorador e consulta
import { Entity, PrimaryGeneratedColumn, Column, createConnection } from 'typeorm';
@Entity()class User { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column({ unique: true }) email: string;}
async function createUser() { const connection = await createConnection({ type: 'postgres', host: 'localhost', database: 'test', entities: [User], synchronize: true }); const user = new User(); user.name = 'Maria'; user.email = 'maria@example.com'; await connection.manager.save(user); console.log(user);}createUser();Características do TypeORM
- Excelente integração com TypeScript e decoradores.
- Flexibilidade: escolha entre Active Record e Data Mapper.
- Suporte a migrações, inscritores de eventos e registro de logs.
- Desvantagem: documentação por vezes incompleta, mudanças frequentes que quebram compatibilidade.
3. Prisma
Prisma é um ORM moderno que difere radicalmente dos seus antecessores. Em vez de modelos no código, você descreve o esquema de dados em um arquivo especial schema.prisma, e o Prisma gera um cliente type-safe. Isso garante autocompletar na IDE e minimiza erros.
Instalação
npm install @prisma/clientnpx prisma initExemplo: esquema e consulta
schema.prisma:
datasource db { provider = "postgresql" url = env("DATABASE_URL")}
model User { id Int @id @default(autoincrement()) name String email String @unique}Código JavaScript:
const { PrismaClie Também na biblioteca
Trabalho com imagens em Rust: biblioteca image e muito mais
Programação Reativa em Go (Golang): bibliotecas, padrões e exemplos
Aprendizado de Máquina em Kotlin: visão geral das bibliotecas KMath, Smile, KotlinDL e DeepLearning4J
Trabalhando com CSV em JavaScript (Node.js): bibliotecas e ferramentas