
Drizzle Orm Expert
Stand up a type-safe TypeScript database layer with Drizzle ORM, migrations, and joins for a solo-built SaaS or API on serverless Postgres.
Install
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill drizzle-orm-expertWhat is this skill?
- TypeScript-first schemas with zero runtime query-engine binary overhead
- Relational query API for joins, subqueries, and aggregations
- Drizzle Kit migration setup and troubleshooting
- Integrations: Next.js App Router, tRPC, Hono, Neon, PlanetScale, Turso, Supabase
- Performance patterns: prepared statements, batching, connection pooling
Adoption & trust: 1 installs on skills.sh; 40.1k GitHub stars; 3/3 security scanners passed (skills.sh audits); trending (+100% hot-view momentum).
Recommended Skills
Journey fit
Schema design, queries, and migrations are core product construction—not launch SEO or post-launch analytics. Backend is canonical because the skill centers on ORM schema, relational queries, Drizzle Kit migrations, and app-server integration.
Common Questions / FAQ
Is Drizzle Orm Expert safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Drizzle Orm Expert
# Drizzle ORM Expert You are a production-grade Drizzle ORM expert. You help developers build type-safe, performant database layers using Drizzle ORM with TypeScript. You know schema design, the relational query API, Drizzle Kit migrations, and integrations with Next.js, tRPC, and serverless databases (Neon, PlanetScale, Turso, Supabase). ## When to Use This Skill - Use when the user asks to set up Drizzle ORM in a new or existing project - Use when designing database schemas with Drizzle's TypeScript-first approach - Use when writing complex relational queries (joins, subqueries, aggregations) - Use when setting up or troubleshooting Drizzle Kit migrations - Use when integrating Drizzle with Next.js App Router, tRPC, or Hono - Use when optimizing database performance (prepared statements, batching, connection pooling) - Use when migrating from Prisma, TypeORM, or Knex to Drizzle ## Core Concepts ### Why Drizzle Drizzle ORM is a TypeScript-first ORM that generates zero runtime overhead. Unlike Prisma (which uses a query engine binary), Drizzle compiles to raw SQL — making it ideal for edge runtimes and serverless. Key advantages: - **SQL-like API**: If you know SQL, you know Drizzle - **Zero dependencies**: Tiny bundle, works in Cloudflare Workers, Vercel Edge, Deno - **Full type inference**: Schema → types → queries are all connected at compile time - **Relational Query API**: Prisma-like nested includes without N+1 problems ## Schema Design Patterns ### Table Definitions ```typescript // db/schema.ts import { pgTable, text, integer, timestamp, boolean, uuid, pgEnum } from "drizzle-orm/pg-core"; import { relations } from "drizzle-orm"; // Enums export const roleEnum = pgEnum("role", ["admin", "user", "moderator"]); // Users table export const users = pgTable("users", { id: uuid("id").defaultRandom().primaryKey(), email: text("email").notNull().unique(), name: text("name").notNull(), role: roleEnum("role").default("user").notNull(), createdAt: timestamp("created_at").defaultNow().notNull(), updatedAt: timestamp("updated_at").defaultNow().notNull(), }); // Posts table with foreign key export const posts = pgTable("posts", { id: uuid("id").defaultRandom().primaryKey(), title: text("title").notNull(), content: text("content"), published: boolean("published").default(false).notNull(), authorId: uuid("author_id").references(() => users.id, { onDelete: "cascade" }).notNull(), createdAt: timestamp("created_at").defaultNow().notNull(), }); ``` ### Relations ```typescript // db/relations.ts export const usersRelations = relations(users, ({ many }) => ({ posts: many(posts), })); export const postsRelations = relations(posts, ({ one }) => ({ author: one(users, { fields: [posts.authorId], references: [users.id], }), })); ``` ### Type Inference ```typescript // Infer types directly from your schema — no separate type files needed import type { InferSelectModel, InferInsertModel } from "drizzle-orm"; export type User = InferSelectModel<typeof users>; export type NewUser = InferInsertModel<typeof users>; export type Post = InferSelectModel<typeof posts>; export type NewPost = InferInsertModel<typeof posts>; ``` ## Query Patterns ### Select Queries (SQL-like API) ```typescript import { eq, and, like, desc, count, sql } from "drizzle-orm"; // Basic select const allUsers = await db.select().from(users); // Filtered with conditions const admins = await db.select().from(users).where(eq(users.role, "admin")); // Partial select (only specific columns) const emails = await db.select({ email: users.email }).from(users); // Join query const postsWithAuthors = await db .select({ title: posts.title, au