| name | sqlx-code-review |
| description | Reviews sqlx database code for compile-time query checking, connection pool management, migration patterns, and PostgreSQL-specific usage. Use when reviewing Rust code that uses sqlx, database queries, connection pools, or migrations. Covers offline mode, type mapping, and transaction patterns. |
sqlx Code Review
Review Workflow
- Check Cargo.toml — Note sqlx features (
runtime-tokio, tls-rustls/tls-native-tls, postgres/mysql/sqlite, uuid, chrono, json, migrate)
- Check query patterns — Compile-time checked (
query!, query_as!) vs runtime (query, query_as)
- Check pool configuration — Connection limits, timeouts, idle settings
- Check migrations — File naming, reversibility, data migration safety
- Check type mappings — Rust types align with SQL column types
Output Format
Report findings as:
[FILE:LINE] ISSUE_TITLE
Severity: Critical | Major | Minor | Informational
Description of the issue and why it matters.
Quick Reference
Review Checklist
Query Patterns
Connection Pool
Transactions
Type Mapping
Migrations
Severity Calibration
Critical
- String interpolation in SQL queries (SQL injection)
- Missing transaction for multi-statement writes (partial writes on error)
- Connection pool created per-request (connection exhaustion)
- Missing bind parameter escaping
Major
- Runtime queries (
query()) where compile-time (query!()) could verify correctness
- Missing transaction rollback on error paths
- Enum type mismatch between Rust and database
- Unbounded
.fetch_all() on potentially large tables
Minor
- Pool defaults used in production without tuning
- Missing
.fetch_optional() (using .fetch_one() then handling error for "not found")
- Overly broad
SELECT * when only specific columns needed
- Missing indexes for queried columns (flag only if query pattern is clearly slow)
Informational
- Suggestions to use
query_as! for type-safe result mapping
- Suggestions to add database-level constraints alongside Rust validation
- Migration organization improvements
Valid Patterns (Do NOT Flag)
- Runtime
query() for dynamic queries — Compile-time checking doesn't work with dynamic SQL
sqlx::FromRow derive — Valid alternative to query_as! for reusable row types
TEXT columns for enum storage — Valid with sqlx::Type derive, simpler than custom SQL types
.execute() ignoring row count — Acceptable for idempotent operations (upserts, deletes)
- Shared DB with other languages — e.g., Elixir owns migrations, Rust reads. This is a valid architecture.
Before Submitting Findings
Load and follow beagle-rust:review-verification-protocol before reporting any issue.