Drizzle ORM - ORM Leve Feito em TypeScript

2025.12.01

O que é Drizzle ORM

Drizzle ORM é um ORM leve projetado com TypeScript em primeiro lugar. Permite escrever queries intuitivamente com sintaxe próxima ao SQL e oferece total type safety.

Características

✓ TypeScript First
✓ Sintaxe próxima ao SQL
✓ Zero dependências (leve)
✓ Suporte a Edge
✓ Otimizado para Serverless

Definição de Schema

Definição de Tabelas

// schema.ts
import { pgTable, serial, text, timestamp, integer, boolean } from 'drizzle-orm/pg-core';

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
  email: text('email').notNull().unique(),
  createdAt: timestamp('created_at').defaultNow()
});

export const posts = pgTable('posts', {
  id: serial('id').primaryKey(),
  title: text('title').notNull(),
  content: text('content'),
  authorId: integer('author_id').references(() => users.id),
  published: boolean('published').default(false),
  createdAt: timestamp('created_at').defaultNow()
});

Definição de Relações

import { relations } from 'drizzle-orm';

export const usersRelations = relations(users, ({ many }) => ({
  posts: many(posts)
}));

export const postsRelations = relations(posts, ({ one }) => ({
  author: one(users, {
    fields: [posts.authorId],
    references: [users.id]
  })
}));

Query Builder

CRUD Básico

import { drizzle } from 'drizzle-orm/node-postgres';
import { eq, and, or, gt, like } from 'drizzle-orm';
import * as schema from './schema';

const db = drizzle(pool, { schema });

// INSERT
const newUser = await db.insert(users).values({
  name: 'Alice',
  email: 'alice@example.com'
}).returning();

// SELECT
const allUsers = await db.select().from(users);

// WHERE
const activeUsers = await db.select()
  .from(users)
  .where(eq(users.isActive, true));

// UPDATE
await db.update(users)
  .set({ name: 'Bob' })
  .where(eq(users.id, 1));

// DELETE
await db.delete(users)
  .where(eq(users.id, 1));

Queries Complexas

// Múltiplas condições
const results = await db.select()
  .from(users)
  .where(
    and(
      gt(users.age, 18),
      or(
        like(users.email, '%@company.com'),
        eq(users.role, 'admin')
      )
    )
  );

// ORDER BY, LIMIT, OFFSET
const pagedUsers = await db.select()
  .from(users)
  .orderBy(desc(users.createdAt))
  .limit(10)
  .offset(20);

// JOIN
const postsWithAuthors = await db.select({
  postTitle: posts.title,
  authorName: users.name
})
  .from(posts)
  .leftJoin(users, eq(posts.authorId, users.id));

Queries Relacionais

// Obter dados aninhados
const usersWithPosts = await db.query.users.findMany({
  with: {
    posts: {
      where: eq(posts.published, true),
      limit: 5
    }
  }
});

// Resultado
// [
//   {
//     id: 1,
//     name: 'Alice',
//     posts: [
//       { id: 1, title: 'First Post', ... },
//       { id: 2, title: 'Second Post', ... }
//     ]
//   }
// ]

Transações

await db.transaction(async (tx) => {
  const user = await tx.insert(users)
    .values({ name: 'Alice', email: 'alice@example.com' })
    .returning();

  await tx.insert(posts).values({
    title: 'My First Post',
    authorId: user[0].id
  });
});

Migrações

Drizzle Kit

# Gerar migração
npx drizzle-kit generate

# Aplicar migração
npx drizzle-kit migrate

# Push do schema para o BD (para desenvolvimento)
npx drizzle-kit push

# Drizzle Studio (GUI)
npx drizzle-kit studio

Arquivo de Configuração

// drizzle.config.ts
import type { Config } from 'drizzle-kit';

export default {
  schema: './src/schema.ts',
  out: './drizzle',
  dialect: 'postgresql',
  dbCredentials: {
    url: process.env.DATABASE_URL!
  }
} satisfies Config;

Suporte a Diversos Bancos de Dados

// PostgreSQL
import { drizzle } from 'drizzle-orm/node-postgres';

// MySQL
import { drizzle } from 'drizzle-orm/mysql2';

// SQLite
import { drizzle } from 'drizzle-orm/better-sqlite3';

// Planetscale
import { drizzle } from 'drizzle-orm/planetscale-serverless';

// Neon
import { drizzle } from 'drizzle-orm/neon-http';

// Turso
import { drizzle } from 'drizzle-orm/libsql';

Comparação com Prisma

AspectoDrizzlePrisma
SintaxePróxima ao SQLDSL própria
Tamanho do bundlePequenoGrande
MigraçõesGeração de códigoPrisma Migrate
Suporte a EdgeNativoPrisma Accelerate
Curva de aprendizadoBaixa se conhece SQLPrecisa aprender sintaxe Prisma

Conclusão

Drizzle ORM é um ORM leve que combina sintaxe próxima ao SQL com total type safety. Otimizado para ambientes edge e serverless, é adequado para projetos TypeScript modernos.

← Voltar para a lista