Database Queries
Overview
Execute read-only SQL queries against PostgreSQL databases via PgBouncer from within application pods. No psql available — use the pg module via node -e.
Configuration
Read project-specific values from the project's CLAUDE.md (## Infrastructure section):
- kubectl context, namespace, app pod label, database name, config file per environment
Constraints
- PgBouncer does NOT support parameterized queries — use inline SQL with quoted values.
- Read-only only. Never run INSERT/UPDATE/DELETE without explicit user confirmation.
- Use
require('/app/node_modules/pg')— module is not in the global node path. - Use
development.config.jsfor DEV,production.config.jsfor PROD (both files exist in every pod).
Process
- Read the project CLAUDE.md for connection details (context, namespace, db name, pod label)
- Find a running pod:
kubectl --context=<ctx> get pods -n <namespace> | grep <app-label> - Get connection details from the config file inside the pod
- Run the query using the helper script or inline
node -e
See scripts/query.js for the reusable helper (copy to pod with kubectl cp).
See references/query-examples.md for command templates.
Common Mistakes
| Mistake | Prevention |
|---|---|
| Not reading CLAUDE.md | Namespace, context, DB name vary per project. |
Parameterized queries ($1::uuid[]) |
PgBouncer rejects them. Use inline SQL. |
require('pg') fails |
Use require('/app/node_modules/pg'). |
| Wrong config file | production.config.js in a DEV pod points to PROD db. Use development.config.js for DEV. |
| Write queries without confirmation | Always ask before INSERT/UPDATE/DELETE. |