<skill_overview> Write safe, validated, and efficient SQLx queries
Writing SQL queries with SQLx Using compile-time query macros Optimizing database access patterns Working with transactions
SQLx GitHub
</skill_overview> <query_rules>
Use query! or query_as! for compile-time validation
Always bind parameters, never concatenate user input
Use fetch_one, fetch_optional, fetch_all appropriately
let rec = sqlx::query!("SELECT id FROM users WHERE email = $1", email) .fetch_optional(&pool) .await?;
</query_rules> <compile_time_checks>
Ensure DATABASE_URL is available at build time Use sqlx prepare and SQLX_OFFLINE for offline builds
</compile_time_checks>
Wrap multi-step changes in a transaction Pass &mut Transaction to query calls
let mut tx = pool.begin().await?; sqlx::query!("DELETE FROM items WHERE id = $1", id) .execute(&mut tx) .await?; tx.commit().await?;
Batch queries instead of querying in loops Prefer streaming fetch for large result sets
<anti_patterns> Never build SQL via string concatenation Do not create a new pool per request Avoid running queries inside loops </anti_patterns>