mcpField
S
sqlalchemy-code-review

sqlalchemy-code-review

github.com/existential-birdsTesting & quality85221 installsUpdated 11w ago
Repository

About sqlalchemy-code-review

A SQLAlchemy code-review skill for checking sessions, relationships, queries, and Alembic migrations. Its review gates require file-and-line evidence for findings about session lifecycle, N+1 queries, and migrations.

Key features

  1. 01Session lifecycle checklist
  2. 02Relationship loading and N+1 checks
  3. 03SQLAlchemy 2.0 query guidance
  4. 04Bulk operation review points
  5. 05Alembic migration checks

Use cases

  1. 01Reviewing session creation and cleanup
  2. 02Finding potential N+1 query patterns
  3. 03Checking migration reversibility

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/existential-birds/beagle --skill sqlalchemy-code-review

After installing, type/sqlalchemy-code-reviewin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
migrations.md
queries.md
relationships.md
sessions.md

Details

From the project README

SQLAlchemy Code Review

Quick Reference

Issue TypeReference
Session lifecycle, context managers, async sessionsreferences/sessions.md
relationship(), lazy loading, N+1, joinedloadreferences/relationships.md
select() vs query(), ORM overhead, bulk opsreferences/queries.md
Alembic patterns, reversible migrations, data migrationsreferences/migrations.md

Review Checklist

  • Sessions use context managers (with, async with)
  • No session sharing across requests or threads
  • Sessions closed/cleaned up properly
  • relationship() uses appropriate lazy strategy
  • Explicit joinedload/selectinload to avoid N+1
  • No lazy loading in loops (N+1 queries)
  • Using SQLAlchemy 2.0 select() syntax, not legacy query()
  • Bulk operations use bulk_insert/bulk_update, not ORM loops
  • Async sessions use proper async context managers
  • Migrations are reversible with downgrade()
  • Data migrations use op.execute() not ORM models
  • Migration dependencies properly ordered

Gates (SQLAlchemy-specific)

Run once per SQLAlchemy-related finding, after you can anchor file:line (see review-verification-protocol) and before the finding ships. If a step’s pass condition is not met, do not assert the finding as written—gather evidence, withdraw, downgrade severity, or rephrase as a question.

Gate 1 — Session scope and lifecycle
StepActionPass condition
1aOpen the module where the session is created or injected (not from memory).file:line for Session, sessionmaker, async_session, or the factory/Depends() that yields a session.
1bIf claiming leak, cross-request sharing, or missing cleanup: trace the session’s scope (context manager, try/finally, middleware).Scoped region cited with a file:line range, or withdraw if scope is correct after the read.
Gate 2 — N+1, lazy loading, eager loads
StepActionPass condition
2aIdentify the loop or repeated call site (ORM attribute access, execute in a loop).file:line for the loop or hot path.
2bIf claiming N+1: name the relationship or query pattern emitted per iteration.Relationship or per-iteration SQL pattern with file:line, or rephrase as a question if unclear.
Gate 3 — Migrations (Alembic)
StepActionPass condition
3aOpen the revision file (e.g. under versions/, or the project’s Alembic layout).Repo-relative path + file:line for revision / upgrade / downgrade.
3bIf claiming broken downgrade() or risky data migration: point at the op.* / op.execute() involved.Snippet or line range in that file for each claimed op, or withdraw.

When to Load References

  • Reviewing session creation/cleanup → sessions.md
  • Reviewing model relationships → relationships.md
  • Reviewing database queries → queries.md
  • Reviewing Alembic migration files → migrations.md

Review Questions

  1. Are all sessions properly managed with context managers?
  2. Are relationships configured to avoid N+1 queries?
  3. Are queries using SQLAlchemy 2.0 select() syntax?
  4. Are all migrations reversible and properly tested?

Comments

Markdown supported