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

57 lines
3.7 KiB
Markdown

---
title: Major Domo Database Release — 2026.3.17
description: Database migration and schema changes for Major Domo v2 on 2026-03-17.
type: reference
domain: server-configs
tags: [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.