postgres-patterns — Claude Code skill: what it does, how to install
PostgreSQL best practice reference based on Supabase guidelines. Covers indexing patterns, data type choices, RLS policies, and slow query diagnosis.
npx skills add affaan-m/ECC --skill postgres-patterns -a claude-codeWhat postgres-patterns does
This skill gives your coding assistant a reference for PostgreSQL schema design and query tuning based on Supabase guidelines. It maps query filters to index types like B-tree, GIN, or BRIN. It also recommends data types, favoring bigint over random UUIDs and text over varchar(255).
The reference provides SQL patterns for backend tasks. You get cursor pagination and worker queue locking with FOR UPDATE SKIP LOCKED. For Row Level Security, it shows why wrapping auth.uid() in a scalar subquery prevents per-row evaluation overhead. Diagnostic queries locate missing foreign key indexes and track slow queries via pg_stat_statements.
Install this skill if you write migrations or debug query latency. If your project does not use PostgreSQL, skip it. For an end-to-end audit workflow, the database-reviewer agent fits better.
What it helps with
- choose the right index type for specific filter conditions
- prevent execution overhead in Row Level Security (RLS) policies
- find unindexed foreign keys in PostgreSQL schemas
- implement cursor pagination instead of slow OFFSET queries
- identify table bloat using pg_stat_user_tables
Example prompts for the agent
- Write an optimized RLS policy for the orders table based on auth.uid()
- Show the index definition for status equality and created_at range filters
- Provide a SQL query to find tables with high dead tuple counts
How to install postgres-patterns
1Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill postgres-patterns -a claude-code2Manually: put the files in place
~/.claude/skills/postgres-patterns/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/postgres-patterns/
1Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill postgres-patterns -a codex2Manually: put the files in place
.agents/skills/postgres-patterns/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill postgres-patterns -a cursor2Manually: put the files in place
.cursor/skills/postgres-patterns/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install affaan-m/ECC postgres-patterns2Manually: put the files in place
.github/skills/postgres-patterns/SKILL.md1Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill postgres-patterns -a gemini-cli2Platform CLI
gemini skills install https://github.com/affaan-m/ECC --path skills/postgres-patternsManually: put the files in place
.devin/skills/postgres-patterns/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill postgres-patterns -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set146
The whole set →Similar
Questions about postgres-patterns
How to install postgres-patterns in Claude Code?
Run npx skills add affaan-m/ECC --skill postgres-patterns -a claude-code. The file will be saved to ~/.claude/skills/postgres-patterns/SKILL.md.
What does postgres-patterns do?
It loads guidelines for PostgreSQL schema design, indexing strategies, RLS security policies, and performance diagnostics into the agent context.
What PostgreSQL extensions does this skill reference?
It uses pg_stat_statements to monitor slow queries and spot calls exceeding 100ms in execution time.
Source text
SKILL.md · MIT
---
name: postgres-patterns
description: PostgreSQL database patterns for query optimization, schema design, indexing, and security. Based on Supabase best practices. Use when designing PostgreSQL schemas, indexes, or RLS policies, or when a query is too slow.
metadata:
origin: ECC
---
# PostgreSQL Patterns
Quick reference for PostgreSQL best practices. For detailed guidance, use the `database-reviewer` agent.
## When to Activate
- Writing SQL queries or migrations
- Designing database schemas
- Troubleshooting slow queries
- Implementing Row Level Security
- Setting up connection pooling
## Quick Reference
### Index Cheat Sheet
| Query Pattern | Index Type | Example |
|--------------|------------|---------|
| `WHERE col = value` | B-tree (default) | `CREATE INDEX idx ON t (col)` |
| `WHERE col > value` | B-tree | `CREATE INDEX idx ON t (col)` |
| `WHERE a = x AND b > y` | Composite | `CREATE INDEX idx ON t (a, b)` |
| `WHERE jsonb @> '{}'` | GIN | `CREATE INDEX idx ON t USING gin (col)` |
| `WHERE tsv @@ query` | GIN | `CREATE INDEX idx ON t USING gin (col)` |
| Time-series ranges | BRIN | `CREATE INDEX idx ON t USING brin (col)` |
### Data Type Quick Reference
| Use Case | Correct Type | Avoid |
|----------|-------------|-------|
| IDs | `bigint` | `int`, random UUID |
| Strings | `text` | `varchar(255)` |
| Timestamps | `timestamptz` | `timestamp` |
| Money | `numeric(10,2)` | `float` |
| Flags | `boolean` | `varchar`, `int` |
### Common Patterns
**Composite Index Order:**
```sql
-- Equality columns first, then range columns
CREATE INDEX idx ON orders (status, created_at);
-- Works for: WHERE status = 'pending' AND created_at > '2024-01-01'
```
**Covering Index:**
```sql
CREATE INDEX idx ON users (email) INCLUDE (name, created_at);
-- Avoids table lookup for SELECT email, name, created_at
```
**Partial Index:**
```sql
CREATE INDEX idx ON users (email) WHERE deleted_at IS NULL;
-- Smaller index, only includes active users
```
**RLS Policy (Optimized):**
```sql
CREATE POLICY policy ON orders
USING ((SELECT auth.uid()) = user_id); -- Wrap in SELECT!
```
**UPSERT:**
```sql
INSERT INTO settings (user_id, key, value)
VALUES (123, 'theme', 'dark')
ON CONFLICT (user_id, key)
DO UPDATE SET value = EXCLUDED.value;
```
**Cursor Pagination:**
```sql
SELECT * FROM products WHERE id > $last_id ORDER BY id LIMIT 20;
-- O(1) vs OFFSET which is O(n)
```
**Queue Processing:**
```sql
UPDATE jobs SET status = 'processing'
WHERE id = (
SELECT id FROM jobs WHERE status = 'pending'
ORDER BY created_at LIMIT 1
FOR UPDATE SKIP LOCKED
) RETURNING *;
```
### Anti-Pattern Detection
```sql
-- Find unindexed foreign keys
SELECT conrelid::regclass, a.attname
FROM pg_constraint c
JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = ANY(c.conkey)
WHERE c.contype = 'f'
AND NOT EXISTS (
SELECT 1 FROM pg_index i
WHERE i.indrelid = c.conrelid AND a.attnum = ANY(i.indkey)
);
-- Find slow queries
SELECT query, mean_exec_time, calls
FROM pg_stat_statements
WHERE mean_exec_time > 100
ORDER BY mean_exec_time DESC;
-- Check table bloat
SELECT relname, n_dead_tup, last_vacuum
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY n_dead_tup DESC;
```
### Configuration Template
```sql
-- Connection limits (adjust for RAM)
ALTER SYSTEM SET max_connections = 100;
ALTER SYSTEM SET work_mem = '8MB';
-- Timeouts
ALTER SYSTEM SET idle_in_transaction_session_timeout = '30s';
ALTER SYSTEM SET statement_timeout = '30s';
-- Monitoring
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- Security defaults
REVOKE ALL ON SCHEMA public FROM public;
SELECT pg_reload_conf();
```
## Related
- Agent: `database-reviewer` - Full database review workflow
- Skill: `clickhouse-io` - ClickHouse analytics patterns
- Skill: `backend-patterns` - API and backend patterns
---
*Based on Supabase Agent Skills (credit: Supabase team) (MIT License)*
© affaan-m · MIT · affaan-m/ECC