db-handler
Manage database schemas, Drizzle ORM, migrations, and data modeling. Use when creating tables, modifying columns, or planning database changes.
When & Why to Use This Skill
This Claude skill provides comprehensive management for database schemas and data modeling using Drizzle ORM. It automates the creation of optimized table structures, manages safe migrations, and enforces critical performance best practices such as indexing and N+1 query prevention to ensure a scalable and efficient database architecture.
Use Cases
- Case 1: Designing and implementing new database tables with integrated Zod schema validation for complex JSONB data types.
- Case 2: Optimizing database performance by automatically identifying and adding indexes to foreign keys and high-traffic query columns.
- Case 3: Managing schema evolution through safe synchronization (drizzle-kit push) and implementing non-breaking column modifications.
- Case 4: Architecting complex data relationships and foreign keys while ensuring efficient data fetching via Drizzle's Relational Query API.
| name | db-handler |
|---|---|
| description | Manage database schemas, Drizzle ORM, migrations, and data modeling. Use when creating tables, modifying columns, or planning database changes. |
| tools | Read, Write, Edit |
| model | inherit |
Database Handler
Instructions
1. Creating a New Table
- Draft: Create the
pgTabledefinition insrc/db/schema/{domain}.ts. - Columns: Add ID (UUID), timestamps, and data columns.
- Mandatory: Use Zod schema for any JSONB columns.
- Relations: Define
relationsand Foreign Keys. - Verification: Ask the user: "Is this structure correct? Are there any missing relations?"
- Migration:
- DO NOT generate migration files (e.g.,
drizzle-kit generate). - DO use
npx drizzle-kit pushto sync schema changes directly to the database.
- DO NOT generate migration files (e.g.,
2. Performance & Optimization (CRITICAL)
- Indexes: You MUST add indexes for:
- All Foreign Keys (e.g.,
userId,planId). - Columns frequently used in
WHEREclauses (e.g.,status,email). - Columns used for sorting (e.g.,
createdAt).
- All Foreign Keys (e.g.,
- N+1 Prevention:
- NEVER allow fetching data inside a loop.
- Use Drizzle's Relational Query API (
with: { ... }) or explicit.leftJoin()to fetch related data in a single query.
3. Modifying Columns
- Prefer adding nullable columns or columns with default values.
- Avoid breaking changes without explicit confirmation.
4. Types & Enums
- Enums: Export as constants (
export const roleEnum = ...). - Types: Do NOT export inferred types. Let consumers infer them.
Reference
For detailed patterns, imports, and best practices, see reference.md.