# Quick Database Setup Guide This guide shows you how to use both PostgreSQL and SQLite with your Rust application. The application automatically detects the database type based on the URL you provide. ## TL;DR - Quick Start ### For SQLite (Zero Setup) ```bash export DATABASE_URL="sqlite:database.db" cargo run --bin server ``` ### For PostgreSQL (Docker) ```bash # Start PostgreSQL docker run -d --name postgres -e POSTGRES_PASSWORD=password -p 5432:5432 postgres:15 # Set URL export DATABASE_URL="postgresql://postgres:password@localhost:5432/postgres" cargo run --bin server ``` ## Database URL Formats ### SQLite URLs - `sqlite:database.db` - Creates database.db in current directory - `sqlite:///tmp/database.db` - Absolute path - `sqlite::memory:` - In-memory database (for testing) ### PostgreSQL URLs - `postgresql://user:password@host:port/database` - `postgres://user:password@host:port/database` ## Configuration Files The application uses TOML configuration files where you can set the database URL: ### config.toml (Default) ```toml [database] url = "sqlite:database.db" # Change this line for different databases max_connections = 10 ``` ### Environment Variables (Recommended) ```bash # Override any config file setting export DATABASE_URL="sqlite:my_app.db" # or export DATABASE_URL="postgresql://user:pass@localhost:5432/mydb" ``` ## Setup Instructions ### SQLite Setup No setup required! Just set the URL and run: ```bash export DATABASE_URL="sqlite:my_app.db" cargo run --bin server ``` The database file will be created automatically when the application starts. ### PostgreSQL Setup #### Option 1: Docker (Recommended) ```bash # Start PostgreSQL container docker run -d \ --name my-postgres \ -e POSTGRES_PASSWORD=mypassword \ -e POSTGRES_DB=myapp \ -p 5432:5432 \ postgres:15 # Wait a moment for startup, then set URL export DATABASE_URL="postgresql://postgres:mypassword@localhost:5432/myapp" cargo run --bin server ``` #### Option 2: Local Installation **macOS (Homebrew):** ```bash brew install postgresql brew services start postgresql createdb myapp export DATABASE_URL="postgresql://$(whoami)@localhost:5432/myapp" ``` **Ubuntu/Debian:** ```bash sudo apt install postgresql postgresql-contrib sudo systemctl start postgresql sudo -u postgres createdb myapp export DATABASE_URL="postgresql://postgres@localhost:5432/myapp" ``` ## Development Workflow ### Use Different Databases for Different Environments **Development (SQLite):** ```bash export DATABASE_URL="sqlite:dev.db" cargo run --bin server ``` **Testing (In-memory):** ```bash export DATABASE_URL="sqlite::memory:" cargo test ``` **Production (PostgreSQL):** ```bash export DATABASE_URL="postgresql://user:pass@db-server:5432/prod_db" cargo run --bin server --release ``` ## Switching Between Databases You can switch databases at any time by changing the `DATABASE_URL`: ```bash # Start with SQLite export DATABASE_URL="sqlite:test.db" cargo run --bin server # Stop the server (Ctrl+C), then switch to PostgreSQL export DATABASE_URL="postgresql://localhost:5432/mydb" cargo run --bin server ``` The application will automatically: - Detect the database type - Create appropriate tables - Use correct SQL syntax for each database ## Common Commands ### SQLite Commands ```bash # Connect to database sqlite3 database.db # Check tables .tables # Query users SELECT * FROM users; # Exit .quit ``` ### PostgreSQL Commands ```bash # Connect to database psql "postgresql://user:pass@localhost:5432/mydb" # List tables \dt # Query users SELECT * FROM users; # Exit \q ``` ## Troubleshooting ### SQLite Issues **Permission Denied:** ```bash # Make sure directory is writable chmod 755 . chmod 644 database.db # if file exists ``` **Database Locked:** - Close any other connections to the database - Make sure no other instances of your app are running ### PostgreSQL Issues **Connection Refused:** ```bash # Check if PostgreSQL is running docker ps # for Docker brew services list | grep postgres # for Homebrew sudo systemctl status postgresql # for Linux ``` **Authentication Failed:** ```bash # Check username/password in URL # For Docker, use the password you set in POSTGRES_PASSWORD # For local install, might need to check pg_hba.conf ``` ### General Database Issues **Tables Not Created:** The application automatically creates tables on startup. If you're having issues: 1. Check the logs for error messages 2. Ensure the database user has CREATE privileges 3. For PostgreSQL, make sure the database exists **Environment Variable Not Working:** ```bash # Check if variable is set echo $DATABASE_URL # Make sure you're in the same terminal session where you set it # Or add it to your shell profile (.bashrc, .zshrc, etc.) export DATABASE_URL="sqlite:database.db" ``` ## Performance Considerations ### SQLite - **Good for:** Single-user apps, development, testing, small datasets - **Limitations:** One writer at a time, no network access - **Tips:** Use WAL mode, enable foreign keys ### PostgreSQL - **Good for:** Multi-user apps, production, large datasets, complex queries - **Benefits:** Full ACID, concurrent writes, advanced features - **Tips:** Tune connection pool, use indexes, monitor performance ## Example .env Files Create a `.env` file in your project root: **For Development (.env.development):** ``` DATABASE_URL=sqlite:dev_database.db ``` **For Production (.env.production):** ``` DATABASE_URL=postgresql://user:password@db.example.com:5432/prod_db ``` **For Testing (.env.test):** ``` DATABASE_URL=sqlite::memory: ``` ## Security Notes ### SQLite Security - Set proper file permissions (600 or 640) - Don't commit database files to version control - Consider encryption for sensitive data ### PostgreSQL Security - Use strong passwords - Enable SSL/TLS in production - Restrict network access - Keep PostgreSQL updated - Use connection pooling ## Backup Strategies ### SQLite Backup ```bash # Simple file copy cp database.db backup_$(date +%Y%m%d).db # Using SQLite command sqlite3 database.db ".backup backup.db" ``` ### PostgreSQL Backup ```bash # Database dump pg_dump $DATABASE_URL > backup_$(date +%Y%m%d).sql # Restore psql $DATABASE_URL < backup.sql ``` ## Summary - **SQLite**: Perfect for development, testing, and simple applications - **PostgreSQL**: Best for production, multi-user, and complex applications - **Switching**: Just change the `DATABASE_URL` environment variable - **No Code Changes**: The application handles both databases automatically The choice between SQLite and PostgreSQL depends on your specific needs, but you can always start with SQLite and migrate to PostgreSQL later as your application grows.