| name | drizzle-nextjs-postgres |
| description | Drizzle ORM against PostgreSQL inside a Next.js App Router app. Covers client construction (globalThis singleton across HMR, serverless pool sizing, `prepare:false` behind PgBouncer/Supavisor, driver choice when you need interactive transactions, `server-only`), reads in Server Components under Next.js 16 Cache Components (`use cache` superseding `unstable_cache` and the `revalidate`/`dynamic` segment configs, Suspense boundaries, React `cache()` dedupe), Server Actions (authorization inside the action, `updateTag` vs `revalidateTag`, `after()`), Postgres schema types (timestamptz, identity vs serial, jsonb, numeric-as-string, bigint modes), drizzle-kit migrations (generate vs push, CONCURRENTLY outside the migrator, NOT VALID constraints, rename prompts), transactions and pooled connections, and Postgres query traps (keyset pagination, count cost, driver-dependent `db.execute()` shape, NOT IN nulls, prepared statements). Use when writing or reviewing Drizzle + Postgres code in Next.js. |
Drizzle + PostgreSQL in Next.js
Library-reference skill for Drizzle ORM on PostgreSQL inside the Next.js App Router — 36 rules across 7 categories. Each rule names the wrong default it corrects; there is no rule for things a capable model already gets right.
This skill is self-contained: it includes the migration-workflow and type-inference rules a Postgres + Next.js developer needs even where the underlying wrong default is not Postgres-specific, so you never have to load a second skill mid-task. A few of those knowingly overlap the sibling drizzle-sqlite skill (same wrong default, restated for this context); the rest are decisions that only exist, or only bite differently, because the dialect is PostgreSQL or the code runs in the App Router.
Pinned to drizzle-orm 0.45.2, drizzle-kit 0.31.10, Next.js 16.2.11, PostgreSQL 14+.
When to Apply
- Writing or reviewing the
lib/db module — driver choice, pooling, singletons, server-only
- Fetching data in a Server Component, Route Handler, or
generateMetadata with db.select() / db.query.*
- Deciding what to cache:
use cache, cacheLife, cacheTag, React cache(), or nothing
- Writing a Server Action that mutates rows and has to invalidate what the read path cached
- Defining or changing a
pgTable — column types, indexes, enums, constraints
- Running
drizzle-kit generate / migrate / push, or hand-editing a generated .sql file
- Wrapping work in
db.transaction(), or debugging a race, deadlock, or exhausted pool
- Reviewing a list, count, or pagination query that is fine locally and slow in production
Rule Categories
| # | Category | Prefix | Covers |
|---|
| 1 | Client Construction & Driver Choice | conn- | Singletons across HMR, serverless pool sizing, poolers, driver capability, server-only, passing schema |
| 2 | Reads in Server Components | rsc- | Suspense boundaries, use cache / cacheLife / cacheTag, request dedupe, waterfalls, runtime choice |
| 3 | Server Actions & Mutations | mut- | Authorization and validation in the action, cache invalidation, deferred writes |
| 4 | Postgres Schema Definition | schema- | timestamptz, identity columns, text vs varchar, numeric, jsonb, bigint modes, table config, enums |
| 5 | Migrations & Schema Change Safety | migrate- | generate vs push, concurrent indexes, where migrations run, renames, lock-safe constraints |
| 6 | Transactions & Pooled Connections | tx- | Connection cost of a held transaction, row locking, serialization retries |
| 7 | Postgres Query Building | query- | Keyset pagination, count cost, driver-dependent execute shape, NULL semantics, prepared statements |
Quick Reference
1. Client Construction & Driver Choice
2. Reads in Server Components
3. Server Actions & Mutations
4. Postgres Schema Definition
5. Migrations & Schema Change Safety
6. Transactions & Pooled Connections
7. Postgres Query Building
How to Use
Read a reference file when its decision comes up. Each rule names the wrong default it corrects, then shows the canonical way (with an incorrect/correct contrast only where the wrong way is a real trap).
Related Skills
drizzle-sqlite — the same ORM against SQLite-family backends; covers the dialect-agnostic query-building rules this skill deliberately omits
nextjs — App Router patterns beyond the data layer
relational-database-design — choosing the schema this skill teaches you to declare
Reference Files