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
| Command | Action / Purpose |
|---|---|
npx drizzle-kit generate | Generate SQL migration files from schema TypeScript files |
npx drizzle-kit migrate | Apply pending SQL migrations to database |
npx drizzle-kit push | Push schema changes directly to database without migration files |
npx drizzle-kit studio | Launch visual browser dashboard to inspect database tables |
Common Pitfalls & Tips
[!WARNING] Remember to export both your table definitions (
users,posts) and theirrelationsdefinitions from your schema file; otherwise Drizzle Relational Queries (db.query) will throw a runtime error!
[!TIP] Use
inferSelectModel<typeof users>andinferInsertModel<typeof users>fromdrizzle-ormto automatically derive TypeScript interface types directly from table schemas.