ORM para TypeScript: Comparação e exemplos de uso
No desenvolvimento moderno com TypeScript, escolher o ORM (Object-Relational Mapping) correto é uma decisão fundamental que impacta o desempenho, a legibilidade do código e a velocidade de desenvolvimento. Neste artigo, compararemos detalhadamente os três ORMs mais populares para TypeScript: Prisma, TypeORM e MikroORM. Você conhecerá seus pontos fortes e fracos, verá exemplos de código e receberá recomendações práticas para o seu projeto.
1. Prisma — o padrão moderno
Prisma é um ORM de nova geração que utiliza sua própria linguagem declarativa de esquemas. Ele gera automaticamente um cliente type-safe com base no esquema do seu banco de dados. O Prisma suporta PostgreSQL, MySQL, SQLite, SQL Server e MongoDB.
Vantagens:
- Sistema de tipos poderoso — todas as consultas são verificadas em tempo de compilação >li>Migrações integradas e editor visual Prisma Studio
- Documentação excelente e comunidade ativa
- Autocompletar na IDE
Desvantagens:
- Etapa adicional de geração do cliente
- Menos flexibilidade para consultas SQL complexas
- Tamanho do pacote relativamente grande
Exemplo de código:
// schema.prismamodel User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[]}
model Post { id Int @id @default(autoincrement()) title String content String? authorId Int author User @relation(fields: [authorId], references: [id])}// app.tsimport { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() { // Criando usuário com post const user = await prisma.user.create({ data: { email: 'alice@example.com', name: 'Alice', posts: { create: { title: 'Hello World' } } }, include: { posts: true } });
// Busca com filtro const users = await prisma.user.findMany({ where: { email: { contains: 'alice' } }, orderBy: { name: 'asc' } });
console.log(users);}
main();2. TypeORM — o veterano consolidado
TypeORM é um dos ORMs mais antigos para TypeScript, inspirado no Hibernate e no Entity Framework. Utiliza decoradores para definir entidades e suporta os padrões Active Record e Data Mapper. Funciona com a maioria dos bancos de dados relacionais.
Vantagens:
- Sistema flexível de decoradores
- Suporte a migrações e sincronização de esquemas
- Grande número de integrações e extensões
- Projeto maduro e testado pelo tempo
Desvantagens:
- Tipagem menos rigorosa em comparação com o Prisma
- Configuração complexa para iniciantes
- Desenvolvimento mais lento recentemente
Exemplo de código:
// entity/User.tsimport { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';import { Post } from './Post';
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column({ unique: true }) email: string;
@Column({ nullable: true }) name: string;
@OneToMany(() => Post, (post) => post.author) posts: Post[];}// app.tsimport { createConnection } from 'typeorm';import { User } from './entity/User';
async function main() { const connection = await createConnection(); const userRepo = connection.getRepository(User);
// Criando const user = userRepo.create({ email: 'bob@example.com', name: 'Bob' }); await userRepo.save(user);
// Busca const users = await userRepo.find({ where: { name: Like('%Bob%') }, relations: ['posts'] });
console.log(users);}
main();3
Também na biblioteca
Event Bus e padrão Observer em TypeScript: implementação e exemplos
Validação de dados em C# (.NET): bibliotecas, atributos e FluentValidation
Zod — poderosa biblioteca para validação de dados em TypeScript
reflect-metadata para TypeScript: guia completo com exemplos