skills/orm/SKILL.md
ORM and data access optimization.
npx skillsauth add arbazkhan971/godmode ormInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
/godmode:orm, "which ORM", "Prisma vs Drizzle"grep -r "prisma\|drizzle-orm\|typeorm\|sqlalchemy" \
package.json requirements.txt go.mod 2>/dev/null
grep -r "include:\|select_related\|joinedload" \
--include="*.ts" --include="*.py" -l 2>/dev/null
Language: <TS|Python|Go|Ruby|Java>
ORM: <Prisma|Drizzle|TypeORM|SQLAlchemy|Django|GORM>
Database: <PostgreSQL|MySQL|SQLite>
Connection: <direct|pooler|serverless>
TypeScript/JavaScript:
Python: SQLAlchemy 2.0 (FastAPI), Django ORM. Go: GORM, Ent, sqlc. Ruby: ActiveRecord.
IF edge/serverless: Drizzle (smallest bundle). IF max type safety: Prisma.
Enable query logging, load list page, count queries. If count = 1 + N, you have N+1.
// BAD (N+1): queries in loop
const posts = await prisma.post.findMany();
for (const p of posts) {
await prisma.user.findUnique({
where: { id: p.authorId }
});
}
// GOOD (1 query with JOIN)
const posts = await prisma.post.findMany({
include: { author: true }
});
ORM equivalents: Django select_related/prefetch,
SQLAlchemy joinedload/selectinload,
Rails includes/eager_load, GORM Preload/Joins.
Formula: pool_size = (core_count * 2) + 1
Typical: 10-20 connections per instance
| Dev | Prod
min | 1 | 5
max | 5 | 20
idle_timeout | 30s | 300s
WARNING: PostgreSQL degrades above ~100 connections.
Use PgBouncer/RDS Proxy for multiplexing.
Coordinate: pool * instances < max_conn * 0.8.
IF pool utilization > 80%: alert and investigate.
Interactive transactions (Prisma $transaction,
SQLAlchemy Session). Optimistic locking for
concurrent updates. Set isolation level for financial.
Nested (savepoints): inner failure does not roll back outer. For non-critical side effects.
Distributed (saga): cross-service ops. Each step has execute + compensate. Compensate in reverse on failure.
Composable conditions: and(...conditions).
Cap pagination: min(limit, 100).
Raw SQL escape hatch: Prisma $queryRaw,
Drizzle sql, SQLAlchemy text().
ALWAYS use parameterized queries.
[ ] Pool configured [ ] Query logging in dev
[ ] N+1 fixed [ ] Slow query threshold (>1s)
[ ] Statement timeout [ ] Retry transient failures
[ ] Migration up+down+up [ ] Schema matches DB
Append .godmode/orm-results.tsv:
timestamp orm models_audited n1_found n1_fixed pool_configured query_reduction_pct status
KEEP if: queries under target latency AND no N+1
AND tests pass.
DISCARD if: query regression OR N+1 introduced
OR pool issues.
STOP when ALL of:
- p50 < 50ms, p99 < 200ms
- No N+1 queries detected
- Pool sized correctly
On failure: git reset --hard HEAD~1. Never pause.
<!-- tier-3 -->| Failure | Action | |--|--| | N+1 persists | Verify include on correct relation | | Pool exhausted | Check leaks, increase with caution | | Migration fails | Check data deps, add backfill | | Deadlock | Consistent lock ordering, reduce scope | | Query timeout | EXPLAIN ANALYZE, add index, paginate |
development
Web performance optimization. Lighthouse, bundle analysis, code splitting, image optimization, critical CSS, fonts, service workers, CDN.
development
Webhook design, delivery, retry, HMAC verification, event subscriptions, dead letter queues.
development
Vue.js mastery. Composition API, Pinia, Vue Router, Nuxt SSR/SSG, Vite optimization, testing.
development
Evidence gate. Run command, read full output, confirm or deny claim. No trust, only proof.