About drizzle-best-practices
A best-practices skill for developers using Drizzle ORM with PostgreSQL, covering schemas, queries, migrations, types, and performance. It highlights API differences between Drizzle versions to guide code choices.
Key features
- 01API guidance by Drizzle version
- 02Schema and query patterns
- 03Relations and migration guidance
- 04TypeScript type-safety advice
- 05Performance and database-driver guidance
Use cases
- 01Write PostgreSQL schemas and CRUD queries
- 02Choose syntax for Drizzle v1 or legacy APIs
- 03Configure drizzle-kit migrations
- 04Select practices for queries and database drivers
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ honra-io/ drizzle-best-practices --skill drizzle-best-practicesAfter installing, type/drizzle-best-practicesin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
.gitignoreAGENTS.mdCLAUDE.mdREADME.mdLICENSEevals/evals.jsonevals/fixtures/eval-2/package.jsonreferences/_sections.mdadvanced-dynamic-queries.mdadvanced-sql-operator.mdmigrations-config.mdperf-prepared-statements.mdquery-filters-operators.mddriver-serverless.mddriver-postgres.mdmigrations-workflow.mdperf-batch-operations.mdquery-error-handling.mdengine-postgres.mdquery-mutations.mdschema-column-types.mdschema-table-definitions.mdschema-indexes-constraints.mdtypes-custom-types.mdtypes-inference.mdquery-select-patterns.mdrelations-defining.mdtypes-validators.mdrelations-querying.mdDetails
From the project READMEDrizzle ORM Best Practices (PostgreSQL)
Comprehensive best practices guide for Drizzle ORM with PostgreSQL. Contains guidance across 8 categories, prioritized by impact to help you write correct, performant, and maintainable database code.
Version & API Detection (read this first)
Drizzle is mid-transition to v1, and the relations + relational-query APIs differ between
the two major lines. Check the project's package.json before writing code so you emit the
right syntax:
Installed drizzle-orm | API to use | Install command |
|---|---|---|
^1.0.0-rc or ^1.0.0-beta | v1 — the default in this skill. defineRelations, object-syntax relational queries (where: { … }, orderBy: { … }), validators from drizzle-orm/zod | npm i drizzle-orm@rc + npm i -D drizzle-kit@rc |
^0.4x (e.g. 0.45.2) | Legacy. relations() helper, callback/operator relational queries, validators from the separate drizzle-zod package | npm i drizzle-orm (resolves to 0.45.2) |
The current release candidate is [email protected] (the @rc tag), which supersedes the
older @beta tag the docs still reference in places.
Three things that routinely trip up agents:
@latestis still0.45.2, not v1.npm i drizzle-ormdoes not get you v1 — a new project that wants the v1 API must ask for@rcexplicitly.- The SQL-like query builder is unchanged across versions.
db.select().from(t).where(eq(t.id, 1)),db.insert(),db.update(),db.delete()work identically in 0.45.x and v1. Only the relational query API (db.query) and relation definitions changed. Never rewritedb.select()operator filters into the relational object syntax. - On v1, the relational query API (
db.query) is driven bydefineRelations. Passing a legacyschemadoes not populatedb.query. The oldrelations()helper is still importable fromdrizzle-orm/_relationsso existing relation modules keep compiling during a port, but to query relationally on v1 you convert them todefineRelations. (Earlier betas exposed adb._querypath; it was removed before1.0.0-rc.3.) Seereferences/relations-defining.md.
When the version is unstated, default to v1 (RC) for new code, but match the existing codebase's
API if you already see legacy relations() / callback-style db.query patterns in use. Throughout
the reference files, version-specific differences are marked with "Legacy (v0.45.x)" callouts.
When to Apply
Reference these guidelines when:
- Defining table schemas with
pgTable - Writing select, insert, update, or delete queries
- Setting up relations between tables using
defineRelationsor the legacyrelationsAPI - Configuring
drizzle-kitfor migrations (generate,push,pull) - Inferring TypeScript types from your schema
- Choosing between the SQL-like API and the relational query API
- Optimizing query performance with prepared statements or batch operations
- Integrating Drizzle with serverless Postgres providers (Neon, Supabase, etc.)
Rule Categories by Priority
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | Schema Design | CRITICAL | schema- |
| 2 | Query Patterns | CRITICAL | query- |
| 3 | Relations | HIGH | relations- |
| 4 | Migrations | HIGH | migrations- |
| 5 | Type Safety | MEDIUM-HIGH | types- |
| 6 | Performance | MEDIUM | perf- |
| 7 | Database Drivers | MEDIUM | driver- |
| 8 | Advanced Patterns | LOW | advanced- |
How to Use
Read individual reference files for detailed explanations and code examples:
references/engine-postgres.md # Postgres-specific types, features, and patterns
references/schema-table-definitions.md
references/query-select-patterns.md
references/relations-defining.md
references/_sections.md # Full index of all references
Each reference file contains:
- Brief explanation of why it matters
- Incorrect code example with explanation
- Correct code example with explanation
- Links to official Drizzle documentation