pgpm-troubleshooting
PGPM Troubleshooting
Quick fixes for common pgpm, PostgreSQL, and testing issues.
When to Apply
Use this skill when encountering:
- Connection errors to PostgreSQL
- Docker-related issues
- Environment variable problems
- Transaction aborted errors in tests
- Deployment failures
PostgreSQL Connection Issues
Docker Not Running
Symptom:
Cannot connect to the Docker daemon
Solution:
- Start Docker Desktop
- Wait for it to fully initialize
- Then run pgpm commands
PostgreSQL Not Accepting Connections
Symptom:
psql: error: connection to server at "localhost" (127.0.0.1), port 5432 failed
Solution:
# Start PostgreSQL container
pgpm docker start
# Load environment variables
eval "$(pgpm env)"
# Verify connection
psql -c "SELECT version();"
Wrong Port or Host
Symptom:
connection refused
Solution:
# Check current environment
echo $PGHOST $PGPORT
# Reload environment
eval "$(pgpm env)"
# Verify settings
pgpm env
Environment Variable Issues
PGHOST Not Set
Symptom:
PGHOST not set
or
could not connect to server: No such file or directory
Solution:
# Load pgpm environment
eval "$(pgpm env)"
Permanent fix - add to shell config:
# Add to ~/.bashrc or ~/.zshrc
eval "$(pgpm env)"
Environment Not Persisting
Symptom: Environment variables reset after each command
Cause: Running eval $(pgpm env) in a subshell or script
Solution: Run in current shell:
# Correct - runs in current shell
eval "$(pgpm env)"
# Wrong - runs in subshell
bash -c 'eval "$(pgpm env)"'
Testing Issues
Tests Fail to Connect
Symptom: Tests time out or fail with connection errors
Solution:
# 1. Start PostgreSQL
pgpm docker start
# 2. Load environment
eval "$(pgpm env)"
# 3. Bootstrap users (run once)
pgpm admin-users bootstrap --yes
# 4. Run tests
pnpm test
Current Transaction Is Aborted
Symptom:
current transaction is aborted, commands ignored until end of transaction block
Cause: An error occurred in the transaction, and PostgreSQL marks the entire transaction as aborted. All subsequent queries fail until the transaction ends.
Solution: Use savepoints when testing operations that should fail:
// Before the expected failure
const point = 'my_savepoint';
await db.savepoint(point);
// Operation that should fail
await expect(
db.query('INSERT INTO restricted_table ...')
).rejects.toThrow(/permission denied/);
// After the failure - rollback to savepoint
await db.rollback(point);
// Now you can continue using the connection
const result = await db.query('SELECT 1');
Pattern for multiple failures:
it('tests multiple failure scenarios', async () => {
// First failure
const point1 = 'first_failure';
await db.savepoint(point1);
await expect(db.query('...')).rejects.toThrow();
await db.rollback(point1);
// Second failure
const point2 = 'second_failure';
await db.savepoint(point2);
await expect(db.query('...')).rejects.toThrow();
await db.rollback(point2);
// Continue with passing assertions
const result = await db.query('SELECT 1');
expect(result.rows[0]).toBeDefined();
});
Tests Interfering with Each Other
Symptom: Tests pass individually but fail when run together
Cause: Missing or incorrect beforeEach/afterEach hooks
Solution:
beforeEach(async () => {
await pg.beforeEach();
await db.beforeEach();
});
afterEach(async () => {
await db.afterEach();
await pg.afterEach();
});
Deployment Issues
Module Not Found
Symptom:
Error: Module 'mymodule' not found
Solution:
- Ensure you're in a pgpm workspace (has
pgpm.json) - Check module is in
packages/directory - Verify module has
.controlfile
Dependency Not Found
Symptom:
Error: Change 'module:path/to/change' not found
Solution:
- Check the referenced module exists
- Verify the change path matches exactly
- Check
-- requires:comment syntax:-- requires: other_module:schemas/other/tables/table
Deploy Order Wrong
Symptom: Foreign key or reference errors during deployment
Solution:
- Check
pgpm.planfor correct order - Verify
-- requires:comments in deploy files - Regenerate plan if needed:
pgpm plan
Docker Issues
Container Won't Start
Symptom:
Error starting container
Solution:
# Stop any existing containers
pgpm docker stop
# Remove old containers
docker rm -f pgpm-postgres
# Start fresh
pgpm docker start
Port Already in Use
Symptom:
port 5432 is already in use
Solution:
# Find what's using the port
lsof -i :5432
# Either stop that process or use a different port
# Edit docker-compose.yml to use different port
Volume Permission Issues
Symptom:
Permission denied on volume mount
Solution:
# Remove old volumes
docker volume rm pgpm_data
# Restart
pgpm docker start
Quick Reference
| Issue | Quick Fix |
|---|---|
| Can't connect | pgpm docker start && eval "$(pgpm env)" |
| PGHOST not set | eval "$(pgpm env)" |
| Transaction aborted | Use savepoint pattern |
| Tests interfere | Check beforeEach/afterEach hooks |
| Module not found | Verify workspace structure |
| Port in use | lsof -i :5432 then stop conflicting process |
Getting Help
If issues persist:
- Check pgpm version:
pgpm --version - Check Docker status:
docker ps - Check PostgreSQL logs:
docker logs pgpm-postgres - Verify environment:
pgpm env
References
- Related skill:
pgpm-dockerfor Docker management - Related skill:
pgpm-envfor environment configuration - Related skill:
pgsql-test-exceptionsfor transaction handling