On boot, run_migrations() checks the Alembic revision:
- no revision + tables exist → stamp head (db.sql was run manually)
- no revision + no tables → upgrade head (fresh install)
- revision present → upgrade head (no-op if already current)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- app/models/: Printer, Filament, PrintJob, Todo, PricingConfig with full
SQLAlchemy 2.x mapped columns and relationships
- app/routers/: list + get-by-id endpoints for all five resources
- app/db.py: SQLAlchemy engine + SessionLocal + get_db dependency
- alembic/: env.py reads MYSQL_* env vars; 0001_initial_schema mirrors db.sql
- alembic.ini: script_location configured, URL injected at runtime
Since db.sql already created the tables, stamp the DB before running future
migrations: alembic stamp head
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>