Installable skillMIT

Drizzle

Build type-safe database queries with Drizzle ORM patterns.

BY clawicUPDATED Oct 27, 2026
INTENDED FORβ—ˆOpenClawInstall in a listed agent.

instructions.md

---
name: drizzle
slug: drizzle
version: 1.0.0
description: Build type-safe database queries with Drizzle ORM patterns.
homepage: https://clawic.com/skills/drizzle
metadata:
  clawdbot:
    emoji: πŸ’§
    requires:
      bins:
      - npx
    os:
    - linux
    - darwin
    - win32
    displayName: Drizzle
---

## Schema Definition
- Export every table from schema file β€” queries fail silently if table isn't exported
- Use `$inferSelect` for query return types, `$inferInsert` for insert input β€” they differ (select has defaults filled, insert has optionals)
- Define `relations()` in a separate call, not inline with table β€” Drizzle separates schema from relations

## Query Syntax Traps
- Conditions use functions, not objects: `where: eq(users.id, 5)` not `where: { id: 5 }` β€” Prisma syntax doesn't work
- Combine conditions with `and()` / `or()`: `where: and(eq(users.active, true), gt(users.age, 18))`
- `db.query.users.findMany()` for relational queries with `with:`, `db.select().from(users)` for SQL-like β€” mixing them causes type errors

## Migrations
- `drizzle-kit push` is dev-only (destructive) β€” production needs `drizzle-kit generate` then `drizzle-kit migrate`
- Schema changes require regenerating migrations β€” editing generated SQL breaks the migration hash
- Set `strict: true` in drizzle.config.ts to catch schema drift before it hits production

## Driver-Specific
- PostgreSQL: use `pgTable`, imports from `drizzle-orm/pg-core`
- MySQL: use `mysqlTable`, imports from `drizzle-orm/mysql-core`  
- SQLite: use `sqliteTable`, imports from `drizzle-orm/sqlite-core`
- Mixing imports across drivers compiles but fails at runtime with cryptic errors

## Performance
- Wrap multi-query operations in `db.transaction(async (tx) => {})` β€” Drizzle doesn't auto-batch
- Use `.prepare()` for queries executed repeatedly β€” skips query building overhead
- Add `.limit()` to every `findMany()` / `select()` β€” no default limit means full table scans

## Common Mistakes
- Forgetting `await` on queries returns a Promise, not results β€” TypeScript doesn't catch this if you ignore the return
- `returning()` is required to get inserted/updated rows back β€” without it you get `{ rowCount }` only
- JSON columns: PostgreSQL uses `jsonb()`, MySQL uses `json()` β€” wrong function = wrong serialization
COMPATIBILITY & REFERENCES

Platform guidance

Imported from the listed AgentSkill.sh category. Complete supplied package files and notices are retained. Required external tools and credentials are not installed. No bundled code was executed during import. Individual agent task behavior has not been tested.