claude-home/major-domo/database-release-2026.3.17.md
Cal Corum be896b4c2a
All checks were successful
Reindex Knowledge Base / reindex (push) Successful in 2s
docs: add missing description frontmatter for kb-rag indexing
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 22:30:48 -05:00

3.7 KiB

title description type domain tags
Major Domo Database Release — 2026.3.17 Database migration and schema changes for Major Domo v2 on 2026-03-17. reference server-configs
major-domo
deployment
release-notes
database

Major Domo Database Release — 2026.3.17

Date: 2026-03-17 Branch: next-release → main (PR #64, 11 commits) Repo: cal/major-domo-database Server: akamai (sba_db_api container, port 801)

Release Summary

11 commits from next-release rebased onto main. Mix of query performance improvements, bug fixes, and code quality cleanup. No schema migrations — safe drop-in deploy.

Performance

  • Push limit/offset to DB in PlayerService.get_players (#37): Previously fetched all rows then sliced in Python. Now passes LIMIT/OFFSET directly to the Peewee query, eliminating full-table reads on paginated requests.
  • Eliminate N+1 queries in batch POST endpoints (#25): Replaced per-row get_or_none() loops in battingstats, results, schedules, and transactions batch insert endpoints with a single bulk set-lookup before the write loop.

Bug Fixes

  • Fix lob_2outs and rbipercent calculation in SeasonPitchingStats (#28): Both fields were returning incorrect values due to wrong formula inputs. Now computed correctly from the underlying stat columns.
  • Invalidate cache after PlayerService write operations (#32): Cache was being populated on reads but never invalidated on writes, causing stale player data to persist until the next restart.
  • Validate sort_by parameter with Literal type in views.py (#36): Unvalidated sort_by could cause silent no-ops or unexpected ordering. Now enforced with a Literal type annotation, raising a 422 on invalid values.

Code Quality

  • Replace bare except: with except Exception: (#29): Silencing KeyboardInterrupt, SystemExit, and GeneratorExit is an antipattern. All 6 instances updated.
  • Remove unused imports in standings.py and pitchingstats.py (#30): Dead imports removed (pydantic in standings.py).
  • Replace print(req.scope) with logger.debug in /api/docs (#21): Debug print statement that logged full request scope on every docs page load replaced with a conditional logger call.
  • Remove empty WEEK_NUMS dict from db_engine.py (#34): Unused stub dict removed.
  • Remove unimplementable skipped caching tests (#33): Tests marked @pytest.mark.skip for a caching interface that was never built. Removed rather than leaving permanently skipped.

Conflict Resolution

Branch was rebased (not squash-merged) onto main. Six files had textual conflicts from two main-branch fixes that landed after next-release diverged:

Trailing slash regression (6 router files)

  • PR #61 on main fixed a production bug: aiohttp converts POST→GET on 307 redirects, silently dropping request bodies. The fix changed all @router.post("")@router.post("/").
  • next-release's batch N+1 and bare-except PRs all touched the same files with the old "" signature.
  • Resolution: kept @router.post("/") from main, applied next-release's functional changes on top.

Case-insensitive team_abbrev filter (transactions.py)

  • PR #60 on main fixed affiliate roster transactions being silently dropped due to case mismatch (input uppercased, DB column mixed-case). Fix used fn.UPPER(Team.abbrev).
  • next-release's version of transactions.py predated this fix.
  • Resolution: preserved fn.UPPER(Team.abbrev) from main alongside next-release's N+1 fix.

requirements.txt

  • Main has fully pinned deps including starlette==0.52.1 (from 2026-03-09 outage) and a new requirements-dev.txt.
  • next-release had loose pins and no requirements-dev.txt.
  • Resolution: took main's fully-pinned version entirely.