paper-dynasty-database/QUICK_START.md

269 lines
6.3 KiB
Markdown

# Quick Start - PostgreSQL Migration Testing
## ✅ PostgreSQL is Running!
Your PostgreSQL database is now running in Docker:
```
✅ PostgreSQL 17: localhost:5432 (container: pd_postgres)
✅ Adminer UI: localhost:8081 (database web interface)
```
---
## 🚀 Step-by-Step Testing Guide
### Step 1: Set Environment Variables
```bash
cd /mnt/NV2/Development/paper-dynasty/database
export DATABASE_TYPE=postgresql
export POSTGRES_HOST=localhost
export POSTGRES_DB=pd_master
export POSTGRES_USER=pd_admin
export POSTGRES_PASSWORD=pd_dev_password
export POSTGRES_PORT=5432
```
### Step 2: Create Database Schema
Run this Python command to create all 30 tables:
```bash
python -c "
from app.db_engine import db, Current, Rarity, Event, Cardset, MlbPlayer, Player, Team, PackType, Pack, Card, Roster, Result, BattingStat, PitchingStat, Award, Paperdex, Reward, GameRewards, Notification, GauntletReward, GauntletRun, BattingCard, BattingCardRatings, PitchingCard, PitchingCardRatings, CardPosition, StratGame, StratPlay, Decision
print('Creating database tables...')
db.create_tables([
Current, Rarity, Event, Cardset, MlbPlayer, Player, Team, PackType, Pack,
Card, Roster, Result, BattingStat, PitchingStat, Award, Paperdex, Reward,
GameRewards, Notification, GauntletReward, GauntletRun, BattingCard,
BattingCardRatings, PitchingCard, PitchingCardRatings, CardPosition,
StratGame, StratPlay, Decision
])
print('✅ All tables created successfully!')
db.close()
"
```
**Expected output:**
```
Creating database tables...
✅ All tables created successfully!
```
### Step 3: Verify Tables in Adminer
1. Open: http://localhost:8081
2. Login:
- System: `PostgreSQL`
- Server: `pd_postgres`
- Username: `pd_admin`
- Password: `pd_dev_password`
- Database: `pd_master`
3. You should see 30 tables listed!
### Step 4: Run the API Locally
```bash
# Make sure you're in the database directory
cd /mnt/NV2/Development/paper-dynasty/database
# Run with hot reload (best for development)
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
```
**Expected output:**
```
INFO: Uvicorn running on http://0.0.0.0:8000
INFO: Application startup complete.
```
### Step 5: Test the API
Open another terminal and test:
```bash
# Test health endpoint
curl http://localhost:8000/
# Test an API endpoint (replace with actual endpoint)
curl http://localhost:8000/api/v2/current
```
Or open in browser:
- API Docs: http://localhost:8000/docs
- API Root: http://localhost:8000
---
## 🧪 Testing GROUP BY Queries
These are the critical queries we fixed for PostgreSQL:
```bash
# Test batting stats with different group_by modes
curl "http://localhost:8000/api/v2/stratplays/batting?group_by=player&limit=5"
curl "http://localhost:8000/api/v2/stratplays/batting?group_by=team&limit=5"
curl "http://localhost:8000/api/v2/stratplays/batting?group_by=playerteam&limit=5"
curl "http://localhost:8000/api/v2/stratplays/batting?group_by=playergame&limit=5"
# Test pitching stats
curl "http://localhost:8000/api/v2/stratplays/pitching?group_by=player&limit=5"
curl "http://localhost:8000/api/v2/stratplays/pitching?group_by=playerteam&limit=5"
```
---
## 🔄 Switching Between SQLite and PostgreSQL
### To use SQLite (existing database):
```bash
export DATABASE_TYPE=sqlite
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
```
### To use PostgreSQL:
```bash
export DATABASE_TYPE=postgresql
export POSTGRES_HOST=localhost
export POSTGRES_DB=pd_master
export POSTGRES_USER=pd_admin
export POSTGRES_PASSWORD=pd_dev_password
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
```
---
## 🛠️ Common Commands
### Docker/Database Management:
```bash
# View PostgreSQL logs
docker compose logs -f postgres
# Stop database (keeps data)
docker compose down
# Restart database
docker compose restart postgres
# Connect to PostgreSQL shell
docker exec -it pd_postgres psql -U pd_admin -d pd_master
# Check container status
docker compose ps
```
### PostgreSQL Commands (inside psql):
```sql
-- List all tables
\dt
-- Describe a table
\d player
-- Count records in a table
SELECT COUNT(*) FROM player;
-- List databases
\l
-- Quit
\q
```
---
## 📊 What's Been Fixed for PostgreSQL
### ✅ Code Changes Completed:
1. **Database Configuration** (`app/db_engine.py`)
- Environment-based PostgreSQL/SQLite switching
- Connection pooling for PostgreSQL
- All 30 models have explicit `table_name`
2. **GROUP BY Fixes** (`app/routers_v2/stratplays.py`)
- Fixed `get_batting_totals()`
- Fixed `get_pitching_totals()`
- Conditionally builds SELECT fields based on `group_by` parameter
- Satisfies PostgreSQL's strict GROUP BY requirements
3. **Dependencies** (`requirements.txt`)
- Added `psycopg2-binary` for PostgreSQL support
4. **Docker Setup** (`docker-compose.yml`)
- PostgreSQL 17 Alpine container
- Adminer database UI
- Local directory mounts (not Docker volumes)
---
## ⚠️ Known Issues
### API Service Commented Out
The API service in `docker-compose.yml` is intentionally commented out because:
- `db_engine.py` calls `db.create_tables()` at module import time
- Multiple gunicorn workers cause race conditions
- Results in "duplicate key" violations
**Solution:** Run the API locally with `uvicorn` instead (Step 4 above).
### Logs Directory
If you get "FileNotFoundError" for logs:
```bash
mkdir -p logs/database
```
---
## 📝 Next Steps
1.**Test all API endpoints** with PostgreSQL
2.**Verify data integrity**
3.**Test GROUP BY queries** with different parameters
4.**Compare results** with SQLite baseline
5. ⏭️ **Data Migration** - See `POSTGRES_MIGRATION_PLAN.md` Step 2
---
## 🆘 Troubleshooting
### PostgreSQL won't start
```bash
# Check logs
docker compose logs postgres
# Restart fresh
docker compose down
sudo rm -rf postgres_data/*
docker compose up -d postgres adminer
```
### Can't connect to database
```bash
# Verify PostgreSQL is ready
docker exec pd_postgres pg_isready -U pd_admin
# Check environment variables
echo $DATABASE_TYPE
echo $POSTGRES_HOST
```
### Table already exists errors
```bash
# Clear and recreate
docker exec -it pd_postgres psql -U pd_admin -d pd_master -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
# Then run Step 2 again
```
---
**Last Updated:** 2025-11-07
**Branch:** `postgres-migration`
**Status:** Ready for testing!