db-postgres
Query PostgreSQL databases configured in .env (DB_POSTGRES_N_*). Use when the user asks to query, explore, or audit data in a Postgres database. Picks connection by label (e.g. 'msgops-dev', 'bms-prod') or numeric index. Read-only by default — writes refused unless DB_POSTGRES_N_ALLOW_WRITE=true on that block.
适合你,如果你需要快速查询或审计 PostgreSQL 数据库中的数据
npx oh-my-skill add evolution-foundation/evo-nexus/db-postgrescurl -fsSL https://oh-my-skill.com/install.sh | bash -s -- evolution-foundation/evo-nexus/db-postgresnpx oh-my-skill verify evolution-foundation/evo-nexus/db-postgres怎么用
商店整理自技能原文 · 版本 7f5dd76 · 表述以原文为准Claude能查询、探索或审计PostgreSQL数据库。默认只读,除非允许写操作。它会根据标签或索引选择连接,执行SQL并返回JSON结果,也可列出表、描述列结构。
当你要求查询、探索或审计PostgreSQL数据库时触发。你可以指定数据库标签(如“msgops-dev”)或索引;未指定时Claude会列出可用连接。
技能原文 SKILL.md
db-postgres
Query Postgres databases declared in .env. Connections follow the same numbered pattern as SOCIAL_YOUTUBE_N_* / SOCIAL_INSTAGRAM_N_* — one block per database, labelled for humans, picked by label or index at call time.
Setup — one-time, per database
Add a block to .env (gitignored). Increment the index per connection:
# ── Postgres: msgops-dev ───────────────────────────── DB_POSTGRES_1_LABEL=msgops-dev DB_POSTGRES_1_HOST=db.dev.internal DB_POSTGRES_1_PORT=5432 DB_POSTGRES_1_DATABASE=msgops DB_POSTGRES_1_USER=agent_readonly DB_POSTGRES_1_PASSWORD=... # raw; .env is gitignored DB_POSTGRES_1_SSL_MODE=require # disable | require | verify-ca | verify-full # DB_POSTGRES_1_SSL_CA_PATH=/path/ca.pem # optional, if verify-* # DB_POSTGRES_1_ALLOW_WRITE=false # default false # DB_POSTGRES_1_QUERY_TIMEOUT=30 # seconds, default 30 # DB_POSTGRES_1_MAX_ROWS=1000 # default 1000 # ── Postgres: bms-prod (read-only replica) ─────────── DB_POSTGRES_2_LABEL=bms-prod DB_POSTGRES_2_HOST=bms-ro.prod.internal DB_POSTGRES_2_PORT=5432 DB_POSTGRES_2_DATABASE=bms DB_POSTGRES_2_USER=agent_readonly DB_POSTGRES_2_PASSWORD=... DB_POSTGRES_2_SSL_MODE=require
Alternative — full DSN instead of components (DSN wins when both are set):
DB_POSTGRES_3_LABEL=evo-ai-dev DB_POSTGRES_3_DSN=postgresql://agent_ro:***@evoai.dev.internal:5432/evoai?sslmode=require
LABEL is always required — it's how agents pick the connection.
Usage
All commands output a single JSON line on stdout (safe to pipe). Errors go to stderr as JSON and exit non-zero.
List configured connections
python3 .claude/skills/db-postgres/scripts/db_client.py accounts
Health-check a connection
python3 .claude/skills/db-postgres/scripts/db_client.py test msgops-dev
Run a read-only query
python3 .claude/skills/db-postgres/scripts/db_client.py query msgops-dev \ "SELECT count(*) FROM users WHERE created_at > now() - interval '7 days'"
Explore schema
# List all tables (public + user schemas) python3 .claude/skills/db-postgres/scripts/db_client.py tables msgops-dev # Describe a table (columns, types, nullability, defaults) python3 .claude/skills/db-postgres/scripts/db_client.py describe msgops-dev users # Schema-qualified: python3 .claude/skills/db-postgres/scripts/db_client.py describe msgops-dev analytics.events
Output shape
Successful query:
{
"ok": true,
"query_id": "uuid-v4",
"label": "msgops-dev",
"columns": ["id", "email", "created_at"],
"rows": [[1, "a@b.com", "2026-04-22T12:00:00"]],
"row_count": 1,
"truncated": false,
"full_result_path": null,
"execution_time_ms": 12
}
When rows exceed MAX_ROWS, truncated is true and full_result_path points to a CSV in ADWs/logs/db-queries/<query_id>.csv — the agent can read that file directly instead of re-running the query.
Error:
{"ok": false, "error_code": "write_blocked", "error": "Write query blocked — connection 'msgops-dev' has ALLOW_WRITE=false. ...", "label": "msgops-dev"}
Error codes:
no_connections— noDB_POSTGRES_N_*blocks in.envnot_found— label/index doesn't match any blockambiguous— multiple blocks share the same label (use index instead)config_error— block present but required field missing (typicallyLABEL)driver_missing—psycopg2not installedconnection_failed— network, auth, TLS, orstatement_timeouttrippedwrite_blocked— write verb detected withoutALLOW_WRITE=truemulti_statement— more than one statement in a single callusage— wrong CLI args
Guardrails
- Write verbs (
DELETE | UPDATE | INSERT | TRUNCATE | DROP | ALTER | CREATE | GRANT | REVOKE | COMMENT | VACUUM | REINDEX) — refused unlessDB_POSTGRES_N_ALLOW_WRITE=true. - Multi-statement queries (anything with
;that has content after it) — refused in v1. - Query timeout — sets
statement_timeout = <QUERY_TIMEOUT>son the session before executing. - Result size —
fetchmany(MAX_ROWS + 1)to detect truncation; full result streamed to CSV when truncated so the agent context never holds >1000 rows.
Workflow
- If the user doesn't specify a label, run
accountsto see what's configured and pick the one that matches their intent. If ambiguous, ask. - Write the smallest SQL that answers the question — prefer aggregates,
LIMIT, andEXPLAINbefore dumping rows. - Run via
query. Inspect the result. - For performance-sensitive queries, load the deep-dive references below.
Dependencies
- Python 3.10+
psycopg2-binary(orpsycopg2) — not pre-installed;uv pip install psycopg2-binaryon first use.
Deep-dive references
These load the PlanetScale database-skills repo verbatim — same content the upstream authors ship for their own tooling.
- EXPLAIN analysis
- Index optimization
- Indexing fundamentals
- MVCC + VACUUM
- MVCC transactions
- Partitioning
- PGBouncer configuration
- Memory management / ops
- Monitoring
- Backup & recovery
- Optimization checklist
Upstream: planetscale/database-skills (MIT). Credit to PlanetScale for the reference content.