Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

README.md

SQLx Database Error Handling Example

Demonstrates comprehensive database error handling patterns using SQLx and masterror.

Features

  • Connection Error Handling - Database connection failures
  • Query Error Mapping - SQL errors to domain errors
  • Constraint Violation Handling - Unique/foreign key violations
  • Transaction Error Patterns - Rollback and commit handling
  • Row Not Found - Handling missing data gracefully

Running

cd examples/sqlx-database
cargo run

This example uses an in-memory SQLite database, so no external setup is required.

Error Scenarios

Connection Errors

// Mapped to AppError::Database
sqlx::SqlitePool::connect("sqlite::memory:").await?

Row Not Found

// Mapped to AppError::NotFound
sqlx::query_as::<_, User>("SELECT * FROM users WHERE id = ?")
    .bind(id)
    .fetch_one(&pool)
    .await?

Unique Constraint Violation

// Mapped to AppError::Conflict
sqlx::query("INSERT INTO users (id, email) VALUES (?, ?)")
    .bind(id)
    .bind(email)
    .execute(&pool)
    .await?

Transaction Handling

let mut tx = pool.begin().await?;

// Operations...

tx.commit().await?; // Or tx.rollback() on error

Error Conversion

masterror automatically converts SQLx errors:

SQLx Error AppError Kind HTTP Status
RowNotFound NotFound 404
UniqueViolation Conflict 409
ForeignKeyViolation Conflict 409
ConnectionError Database 500
Other database errors Database 500

Testing

cargo test

License

MIT