Help us improve
Share bugs, ideas, or general feedback.
From beagle-python
Reviews SQLAlchemy code for session management, relationship patterns, N+1 queries, and Alembic migrations. Activates when SQLAlchemy code is detected.
npx claudepluginhub existential-birds/beagle --plugin beagle-pythonHow this skill is triggered — by the user, by Claude, or both
Slash command
/beagle-python:sqlalchemy-code-reviewThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
| Issue Type | Reference |
Reviews database migration safety, schema design, query correctness, and data integrity with engine-specific knowledge (Postgres, MySQL, SQLite).
Provides SQLAlchemy 2.0 patterns for Python database operations including ORM models, async engines, relationships, and common queries. Useful for robust DB layers in Python apps.
Provides SQLAlchemy 2.0 patterns for model definitions, sync/async engines, relationships, query optimization, repository pattern, and transactions in Python apps.
Share bugs, ideas, or general feedback.
| Issue Type | Reference |
|---|---|
| Session lifecycle, context managers, async sessions | references/sessions.md |
| relationship(), lazy loading, N+1, joinedload | references/relationships.md |
| select() vs query(), ORM overhead, bulk ops | references/queries.md |
| Alembic patterns, reversible migrations, data migrations | references/migrations.md |
with, async with)relationship() uses appropriate lazy strategyjoinedload/selectinload to avoid N+1select() syntax, not legacy query()downgrade()op.execute() not ORM modelsRun 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.
| Step | Action | Pass condition |
|---|---|---|
| 1a | Open 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. |
| 1b | If 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. |
| Step | Action | Pass condition |
|---|---|---|
| 2a | Identify the loop or repeated call site (ORM attribute access, execute in a loop). | file:line for the loop or hot path. |
| 2b | If 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. |
| Step | Action | Pass condition |
|---|---|---|
| 3a | Open the revision file (e.g. under versions/, or the project’s Alembic layout). | Repo-relative path + file:line for revision / upgrade / downgrade. |
| 3b | If 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. |
select() syntax?