ORMs em Node.js: o Buraco que Parece Raso, mas Engole Projetos Inteiros

Onde Começa a Fumaça: O Custo Invisível dos ORMs

Todo dev já caiu nessa: instala um ORM achando que vai ganhar “velocidade” e “produtividade”. Uma semana depois, está lutando com migrations quebradas, consultas que parecem poesia concretista e um acoplamento tão forte que o domínio vira refém do modelo relacional.

É assim que nasce a dívida técnica mais sorrateira do Node.js moderno.

Os tópicos mais discutidos nas comunidades reforçam isso: TypeORM que quebra ao migrar, Prisma gerando SQL gordo, ORMs que tentam ser tudo ao mesmo tempo (camada de dados, validação, DSL e gerador de schema). E cada mágica inserida ali significa uma coisa: você perde o controle direto daquilo que realmente importa — o SQL executado.

O Caminho Sênior: Query Builder Enxuto + Controle Total

Quer evitar over-engineering? Pare de delegar lógica para frameworks que tentam “entender o seu domínio” melhor que você. A saída pragmática é usar ferramentas minimalistas como Kysely ou Drizzle no modo “query builder puro”.

Você controla o SQL. Você controla o custo. Você controla o impacto no negócio.

Sem proxies mágicos, sem decorators que escondem o que está acontecendo, sem migrations que se auto-inventam.

Implementação de Senior na Prática

Aqui está um exemplo real usando Kysely — nada de firula, nada de abstração gourmet:

import { Kysely, PostgresDialect } from 'kysely'
import { Pool } from 'pg'

interface DB {
  users: {
    id: number
    name: string
    email: string
  }
}

const db = new Kysely<DB>({
  dialect: new PostgresDialect({
    pool: new Pool({
      connectionString: process.env.DATABASE_URL
    })
  })
})

// Consulta previsível, explícita
const users = await db
  .selectFrom('users')
  .select(['id', 'name', 'email'])
  .where('email', '=', 'teste@acme.com')
  .execute()

Simples. Rastreável. Fácil de revisar. E o SQL gerado você enxerga — não precisa torcer para que o ORM não invente moda.

O Preço da Escolha: ORMs vs Query Builders

Se você insiste em usar um ORM, aceite os custos:

  • Migrations que quebram porque o framework não acompanha sua modelagem.
  • Consultas que você não controla e que explodem a conta do Postgres.
  • Um acoplamento estrutural que te impede de evoluir o domínio sem reescrever metade da camada de dados.

Se você usa query builder:

  • Mais responsabilidade? Sim. Mas mais previsibilidade também.
  • Menos mágica? Sim. Mas menos dor também.
  • SQL explícito? Obrigatório. E isso é uma vantagem.

Direto das Trincheiras

  • Evite ORMs quando o negócio tem regras complexas: eles vão se tornar o gargalo das features.
  • Monitore o SQL gerado: se você não consegue explicá-lo em 20 segundos, tem algo errado.
  • Mantenha migrations sob seu controle: automatização demais cria inconsistências que cobram juros altos.

Fontes

Qual o melhor ORM para PostgreSQL em Node.js? : r/node, nodebestpractices/README.brazilian-portuguese.md, Qual ORM você usa em produção? : r/node, Migrar ou não migrar – o TypeORM está realmente morrendo? : r/node

Obrigado por acompanhar essa reflexão até o fim!

Espero que esses pontos ajudem você a tomar decisões mais lúcidas no seu próximo projeto. Não deixe de conferir outros artigos aqui no blog, onde descascamos outros hypes da nossa área.

Valeu e até a próxima! 😉

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *