Database Operations
Managing the PostgreSQL database with Prisma.
Overview
The database schema is defined in packages/database/ using Prisma. We use:
- Neon for PostgreSQL hosting
- Prisma for schema management and migrations
- Three environments: local, staging, production
Credentials Location
Database credentials are stored in:
packages/database/.env.local
packages/database/.env.staging
packages/database/.env.productionEach contains:
env
DATABASE_URL="postgresql://..." # Pooled connection
DIRECT_URL="postgresql://..." # Direct connection (migrations)
REDIS_URL="redis://..."Warning
Never commit these files. They're git-ignored and managed separately.
Migrations
Development Workflow
bash
# 1. Edit schema in packages/database/prisma/schema.prisma
# 2. Create migration
pnpm db:migrate:local
# 3. Apply to staging
pnpm db:migrate:staging
# 4. Apply to production (careful!)
pnpm db:migrate:prodDeploy Migrations
Deploy applies migrations without interactive prompts (for CI/CD):
bash
pnpm db:deploy:local
pnpm db:deploy:staging
pnpm db:deploy:prodGenerate Client
After schema changes:
bash
pnpm db:generateThis regenerates the Prisma client for all packages.
Prisma Studio
Visual database browser:
bash
# Local database
pnpm db:studio:local
# Staging database
pnpm db:studio:staging
# Production database (read-only recommended)
pnpm db:studio:prodOpens at http://localhost:5555
Backup & Recovery
Backup
bash
# Create backup
pnpm db:backupBackups are stored in backups/ with timestamps.
Restore
bash
# Restore from backup
pnpm db:restoreClone Database
bash
# Clone database (useful for testing)
pnpm db:cloneDatabase Protection
Prevent accidental writes to production:
bash
# Enable protection
pnpm db:protect
# Disable protection (for migrations)
pnpm db:unprotectStatus Check
bash
# View database status
pnpm db:statusShows migration status, connection info, and table stats.
Schema Structure
Key tables:
workflow- Workflow definitionscollection- NFT collectionsminiapp_generation- User generationsminiapp_payment- Payment recordsuser- Universal user table
Best Practices
- Always backup before production migrations
- Test migrations on staging first
- Use db:protect when not migrating
- Review migration SQL before applying to prod
- Keep migrations small and reversible
