TODO: soft-deletion
- GetXyzByID should include `ErrItemIsDeleted` if item is soft-deleted

IDEA: migrations-table
- Store migrations in a table.  This makes the schema more self-documenting.
- Possible schema: name, sql_up, sql_down, hash (computed from those fields plus previous migration hash)
    - or just rowid instead of hash?  Migration sequence should be immutable after publishing, so there should never be "conflicts"

TODO: language-server-for-TODO.txt

TODO: auto-migration-checker
- Use `pkg/schema` to test whether a base schema plus a migration equals a new schema

TODO: codegen SaveXyz update path doesn't check foreign keys
- Insert path has FK error handling, but the update path wraps everything in Must
- An update that violates an FK constraint will panic instead of returning an error

TODO: generated test file inclues global test DB setup, which is wrong

TODO: join-tables
- handle codegen for without rowid tables properly
- add "get all X for Y"
- Example: `chat_pinned_messages`

TODO: consider CreateDB and CreateMemoryDB

TODO: generate tests for the remaining CRUD, try to hit ~100% default test coverage

TODO: test reporter
- coverage: https://x.com/wispem_wantex/status/2009799380648505563
    - Jest shows for each file: % of lines, functions, branches and statements covered
    - Go reporter should show:
        - group coverage stats by either function, file or package
        - count by statements, branches or functions
        - Show both raw count and percentage
        - list which lines / branches / functions were missed
        - pretty (terminal) format or JSON format

TODO: foreign key to compound-FK table
    - sample: booru_post_tag_votes
