Drizzle ORM Syntax Cheat Sheet

Quick reference guide for Drizzle ORM: Table definitions, TypeScript queries, relational queries, and Drizzle Kit.

Databases
drizzle
orm
typescript

Drizzle ORM is a lightweight, type-safe TypeScript ORM that mirrors SQL syntax without hidden magic or runtime abstraction overhead.

Schema Definition (`schema.ts`)

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

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(),
  authorId: integer("author_id").references(() => users.id, { onDelete: "cascade" })
});

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

SQL Queries & Relational API

typescript
import { db } from "./db";
import { users, posts } from "./schema";
import { eq, like, desc } from "drizzle-orm";

// 1. Select with SQL expressions
const activeUsers = await db
  .select({ id: users.id, name: users.name })
  .from(users)
  .where(like(users.email, "%@example.com"))
  .orderBy(desc(users.createdAt))
  .limit(10);

// 2. Relational Query API
const result = await db.query.users.findMany({
  where: eq(users.id, 1),
  with: {
    posts: true
  }
});

// 3. Insert record
await db.insert(users).values({
  name: "Bob",
  email: "bob@example.com"
});

Essential Drizzle Kit Commands

Table
CommandAction / Purpose
npx drizzle-kit generateGenerate SQL migration files from schema TypeScript files
npx drizzle-kit migrateApply pending SQL migrations to database
npx drizzle-kit pushPush schema changes directly to database without migration files
npx drizzle-kit studioLaunch visual browser dashboard to inspect database tables

Common Pitfalls & Tips

[!WARNING] Remember to export both your table definitions (users, posts) and their relations definitions from your schema file; otherwise Drizzle Relational Queries (db.query) will throw a runtime error!

[!TIP] Use inferSelectModel<typeof users> and inferInsertModel<typeof users> from drizzle-orm to automatically derive TypeScript interface types directly from table schemas.