Awesome-omni-skill N+1 Query Detection
Detect N+1 query patterns in GORM repository and service code — identify loops that execute queries, missing preloads, and unbounded fetches
install
source · Clone the upstream repo
git clone https://github.com/diegosouzapw/awesome-omni-skill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/n-1-query-detection" ~/.claude/skills/diegosouzapw-awesome-omni-skill-n-1-query-detection && rm -rf "$T"
manifest:
skills/development/n-1-query-detection/SKILL.mdsource content
N+1 Query Detection Skill
Scan repository and service code for N+1 query patterns that cause performance degradation.
Trigger Conditions
- Repository or service files are modified
- Performance review is requested
- New data access patterns are introduced
- User invokes with "N+1 check" or "n-plus-1-query-detection"
Input Contract
- Required: Path to repository and/or service files
- Optional: GORM configuration for preload analysis
Output Contract
- List of N+1 patterns found with file:line references
- Severity assessment (critical for high-volume paths, low for admin-only)
- Fix recommendation (Preload, Joins, or batch query)
- Unbounded query warnings (missing Limit)
Tool Permissions
- Read: Repository files, service files, model relationship definitions
- Write: None (read-only analysis)
- Search: Grep for loop patterns,
,.Find()
, relationship access.First()
Execution Steps
- Scan for loops with queries: Find patterns where a database query is inside a
loopfor - Check preloads: For each query that accesses relationships, verify
orPreload()
is usedJoins() - Check unbounded queries: Find
calls without.Find()
on list endpoints.Limit() - Assess severity: Rate each finding by the expected data volume (high-traffic endpoints are critical)
- Recommend fixes: Suggest specific GORM patterns (
,Preload
,Joins
)SelectinLoad - Report: Produce findings with code examples for the fix
Common Patterns (Anti-patterns)
// N+1: Query inside loop users, _ := db.Find(&users) for _, u := range users { db.Where("user_id = ?", u.ID).Find(&orders) // N+1! } // Fix: Preload db.Preload("Orders").Find(&users)
References
.cursor/rules/122-gorm-conventions.mdc.cursor/rules/047-performance-optimization.mdc