Database Requirements
- PostgreSQL: Version 15 or higher
- Extensions: None required (uses standard SQL)
- SSL: Recommended for production
- Connection Pooling: Built-in with Drizzle
Schema Overview
The database schema includes:"Models": AI trading model configurations"Orders": Trading positions and closed trades (SSOT)"PortfolioSnapshots": Historical portfolio value tracking"Conversations": AI chat history and decision logs"CryptoPrice": Real-time and historical price data
Table names use quoted identifiers with capital letters (e.g.,
"Models"). Always quote them in SQL queries to avoid case-sensitivity issues.Drizzle Configuration
Thedrizzle.config.ts file defines the ORM settings:
drizzle.config.ts
Configuration Details
schema: TypeScript schema definitions atsrc/db/schema.tsout: Generated SQL migrations stored indrizzle/ssl: Enabled withrejectUnauthorized: falsefor self-signed certs
Database Connection
The application uses T3 Env for type-safe environment variable access:src/env.ts
Connection String Format
user: Database usernamepassword: Database passwordhost: Database server hostname or IPport: PostgreSQL port (default:5432)database: Database namesslmode:require,prefer, ordisable
Migration Workflow
Generate Migrations
After modifyingsrc/db/schema.ts, generate migration files:
drizzle/ like:
Apply Migrations
Run migrations against the database:Push Schema (Development)
For rapid prototyping, push schema changes directly:Schema Management
Key Schema Rules
-
Quoted Identifiers: All table names use capital letters and require quotes
-
Text IDs: Primary keys are
TEXT(UUID), notSERIALorINTEGER -
Monetary Fields: Stored as
TEXT, cast toNUMERICfor calculations -
JSONB for Complex Data: Exit plans, AI reasoning stored as JSONB
Example Schema Definition
src/db/schema.ts
Database Seeding
Seed initial data for development:scripts/seed.ts which:
- Clears existing data
- Creates default AI models (Apex, Trendsurfer, Contrarian, Sovereign)
- Optionally creates sample trades and positions
Seed Script Example
scripts/seed.ts
Production Database Setup
Option 1: Managed PostgreSQL (Recommended)
Use a managed service for automatic backups, scaling, and monitoring:- Neon: Serverless PostgreSQL with free tier
- Supabase: PostgreSQL with additional features
- Railway: Simple managed PostgreSQL
- AWS RDS: Enterprise-grade with multi-AZ
- Create project at neon.tech
- Copy connection string
- Set
DATABASE_URLenvironment variable - Run migrations:
bun run db:migrate
Option 2: Self-Hosted with Docker
Included indocker-compose.yml:
Database Initialization
Database Maintenance
Backups
Manual Backup:Restore
Vacuum and Analyze
Regularly optimize database performance:Index Optimization
Add indexes for frequently queried columns:Monitoring
Connection Pool Status
Drizzle automatically manages connection pooling. Monitor active connections:Slow Query Log
Enable slow query logging inpostgresql.conf:
Database Size
Table Sizes
Troubleshooting
Migration Fails
Problem:db:migrate returns errors
Solutions:
- Check
drizzle/meta/_journal.jsonfor migration state - Manually inspect SQL files in
drizzle/ - Verify database connection:
psql $DATABASE_URL - Check for schema conflicts (duplicate tables/columns)
- Use
db:pushto force sync (development only)
Connection Timeouts
Problem: API can’t connect to database Solutions:- Verify
DATABASE_URLformat and credentials - Check firewall rules (port 5432)
- Ensure PostgreSQL is running:
systemctl status postgresql - Test connection:
psql $DATABASE_URL - Check SSL settings (remove
?sslmode=requireif not using SSL)
Quoted Identifier Errors
Problem:relation "models" does not exist
Solutions:
- PostgreSQL lowercases unquoted identifiers
- Always quote table names:
SELECT * FROM "Models" - Use Drizzle ORM to avoid manual SQL
- Check that migrations preserve quotes
Data Type Mismatch
Problem: Cannot castTEXT to NUMERIC
Solutions:
- Use explicit casts:
CAST("netPortfolio" AS NUMERIC) - Ensure monetary values are valid numbers (no empty strings)
- Validate data before insert/update
- Use Drizzle’s type system to catch errors at compile time
Best Practices
- Always Use Migrations: Don’t manually modify production schema
- Test Locally First: Run migrations on dev database before production
- Backup Before Migration: Create backup before applying schema changes
- Monitor Performance: Use
EXPLAIN ANALYZEfor slow queries - Use Indexes: Add indexes for foreign keys and frequently filtered columns
- Connection Pooling: Let Drizzle handle connection management
- SSL in Production: Always use encrypted connections
Next Steps
Backend Deployment
Deploy the API server with database access
Schema Reference
Detailed schema documentation

