DEV Community

Alex Spinov
Alex Spinov

Posted on

Drizzle ORM Has a Free Type-Safe SQL API That Outperforms Prisma

Drizzle ORM generates zero-overhead SQL from TypeScript. No query engine, no runtime cost — just your SQL with full type safety.

Setup

npm install drizzle-orm postgres
npm install -D drizzle-kit
Enter fullscreen mode Exit fullscreen mode

Define Your Schema

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

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
  email: text('email').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)
});
Enter fullscreen mode Exit fullscreen mode

Query API

import { drizzle } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';
import { eq, like, desc, count } from 'drizzle-orm';

const sql = postgres('postgres://...');
const db = drizzle(sql);

// Select with conditions
const activeUsers = await db.select()
  .from(users)
  .where(like(users.email, '%@company.com'))
  .orderBy(desc(users.createdAt))
  .limit(10);

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

// Aggregate
const postCounts = await db.select({
  author: users.name,
  totalPosts: count(posts.id)
}).from(users)
  .leftJoin(posts, eq(users.id, posts.authorId))
  .groupBy(users.name);

// Insert returning
const [newUser] = await db.insert(users)
  .values({ name: 'Bob', email: 'bob@example.com' })
  .returning();

// Update
await db.update(users)
  .set({ name: 'Robert' })
  .where(eq(users.id, newUser.id));
Enter fullscreen mode Exit fullscreen mode

Migrations

npx drizzle-kit generate
npx drizzle-kit migrate
npx drizzle-kit studio  # visual database browser
Enter fullscreen mode Exit fullscreen mode

Why Drizzle Over Prisma

  • No query engine: Prisma bundles a Rust binary. Drizzle is pure TS.
  • SQL-like API: If you know SQL, you know Drizzle.
  • Serverless-friendly: No cold start overhead from engine initialization.
  • Smaller bundles: Drizzle adds ~50KB vs Prisma's ~10MB engine.

Need custom database tooling or backend architecture? I build developer tools and data pipelines. Check out my web scraping actors on Apify or reach out at spinov001@gmail.com for custom solutions.

Top comments (0)