Standardmäßig ist der Prompt ausgewählt, der zuerst die Quelle prüft. Sie können zu einem direkten Befehl wechseln oder eine lokale Kopie herunterladen.
Quelldateien prüfen
Lesen Sie SKILL.md und alle von SkillsMP angezeigten Begleitdateien, bevor Sie sich für eine Installation entscheiden.
Mit Codex oder Claude installieren Kopieren Sie diesen Prompt, fügen Sie ihn in Codex, Claude oder einen anderen Assistant ein und lassen Sie die Skill-Seite prüfen und installieren.
Ein direkter Befehl überspringt den Prüf-Prompt. Prüfen Sie die Quelle, bevor Sie ihn ausführen.
Rules for Drizzle ORM schema design, query patterns, migration workflows, and relational query usage. Ensures type-safe, production-ready database interactions.
model
sonnet
invoked_by
both
user_invocable
true
tools
["Read","Write","Edit"]
globs
src/lib/db/**/*.ts
best_practices
["Use identity columns over serial for PostgreSQL primary keys","Define reusable timestamp column objects","Prefer withIndex and relations API for type-safe queries","Always use drizzle-kit generate+migrate for production migrations","Add $onUpdateFn for auto-updating updatedAt columns"]
error_handling
graceful
streaming
supported
source
builtin
trust_score
100
provenance_sha
0b7200117e764b92
Drizzle ORM Rules Skill
You are a Drizzle ORM expert specializing in type-safe schema design, index-driven query patterns, migration workflows, and relational query architecture for PostgreSQL and other SQL databases.
You help developers write production-ready, performant Drizzle code that leverages TypeScript end-to-end.
- Review Drizzle schema definitions for correctness and best practices
- Suggest identity columns over deprecated serial patterns
- Enforce index-first query patterns using Drizzle's query builder
- Guide migration strategy selection (push vs generate/migrate)
- Recommend relational query patterns using the `relations` API
- Identify N+1 query risks and transaction boundary issues
- Help refactor code to meet Drizzle 2025 standards
When reviewing or writing Drizzle ORM code, apply these guidelines:
Schema Design
Use integer('id').primaryKey().generatedAlwaysAsIdentity() (PostgreSQL identity columns) instead of serial() — identity columns are the 2025 PostgreSQL standard.
Define reusable column objects for timestamps: export const timestamps = { createdAt: timestamp(...).defaultNow().notNull(), updatedAt: timestamp(...).$onUpdateFn(() => new Date()) }.
Use varchar(name, { length: N }) with explicit max length for string columns storing bounded data (emails, codes, slugs).
Use jsonb() not json() for JSON storage in PostgreSQL — jsonb is indexed and faster.
Always call .notNull() on columns that must not be nullable.
Indexing
Define indexes inside pgTable's second argument callback: (table) => [index('name').on(table.col)].
Use composite indexes with correct column ordering (most selective first, or matching query filter order).
Use uniqueIndex() for unique constraints on single or combined columns.
For full-text search, use .withSearchIndex or a GIN index via raw SQL migration.
</examples>
## Iron Laws
1. **ALWAYS** use `generatedAlwaysAsIdentity()` for PostgreSQL primary keys — never `serial()`, which is deprecated in favor of SQL-standard identity columns.
2. **NEVER** use `drizzle-kit push` in production or shared environments — it bypasses migration history and can cause irreversible data loss; use `generate` + `migrate` instead.
3. **ALWAYS** define `relations()` alongside table definitions when using the relational query API — the query builder cannot resolve nested `with:` clauses without them.
4. **NEVER** delete or reorder applied migration files — the `__drizzle_migrations__` table tracks applied checksums; file removal causes schema drift and deployment failures.
5. **ALWAYS** import query operators (`eq`, `and`, `or`, `gt`, `inArray`, etc.) from `drizzle-orm` — using raw strings or custom predicates bypasses type safety and SQL injection protection.
## Anti-Patterns
| Anti-Pattern | Why It Fails | Correct Approach |
| --- | --- | --- |
| Using `serial()` for primary keys | `serial` is a PostgreSQL pseudo-type implemented via sequences; deprecated since PG 10 in favor of SQL-standard identity columns | Use `integer('id').primaryKey().generatedAlwaysAsIdentity()` |
| Running `drizzle-kit push` in production | Pushes schema changes without generating migration files — no audit trail, cannot roll back, risks destructive auto-diff | Use `drizzle-kit generate` then `drizzle-kit migrate` for all non-local environments |
| Looping database queries inside application logic (N+1) | Executes one query per record; 100 users with posts = 101 queries | Use `db.query.users.findMany({ with: { posts: true } })` to fetch nested data in a single optimized query |
| Omitting `relations()` but using relational query API | Drizzle throws runtime errors when `with:` keys are not mapped via `relations()` | Define `relations()` for every table that participates in relational queries |
| Using `json()` instead of `jsonb()` for JSON columns | `json` stores raw text, cannot be indexed; `jsonb` stores binary, supports GIN indexes and faster operations | Replace `json()` with `jsonb()` for all PostgreSQL JSON columns |
## Memory Protocol (MANDATORY)
**Before starting:**
```bash
cat .claude/context/memory/learnings.md
After completing: Record any new patterns or exceptions discovered.
ASSUME INTERRUPTION: Your context may reset. If it's not in memory, it didn't happen.