/
germanubis
/
sqlx
Обзор
Документация
Войти
/
germanubis
/
sqlx
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
examples/postgres/transaction/src/main.rs
106 строк
3 KB
Austin Bonander
0.7.0 release (#2575)
04 июл 2023, 00:37
Не верифицирован
04 июл 2023, 00:37
dcb58b0
Код
Авторство
О чём код?
use sqlx::query; async fn insert_and_verify( transaction: &mut sqlx::Transaction<'_, sqlx::Postgres>, test_id: i64, ) -> Result<(), Box<dyn std::error::Error>> { query!( r#"INSERT INTO todos (id, description) VALUES ( $1, $2 ) "#, test_id, "test todo" ) // In 0.7, `Transaction` can no longer implement `Executor` directly, // so it must be dereferenced to the internal connection type. .execute(&mut **transaction) .await?; // check that inserted todo can be fetched inside the uncommitted transaction let _ = query!(r#"SELECT FROM todos WHERE id = $1"#, test_id) .fetch_one(&mut **transaction) .await?; Ok(()) } async fn explicit_rollback_example( pool: &sqlx::PgPool, test_id: i64, ) -> Result<(), Box<dyn std::error::Error>> { let mut transaction = pool.begin().await?; insert_and_verify(&mut transaction, test_id).await?; transaction.rollback().await?; Ok(()) } async fn implicit_rollback_example( pool: &sqlx::PgPool, test_id: i64, ) -> Result<(), Box<dyn std::error::Error>> { let mut transaction = pool.begin().await?; insert_and_verify(&mut transaction, test_id).await?; // no explicit rollback here but the transaction object is dropped at the end of the scope Ok(()) } async fn commit_example( pool: &sqlx::PgPool, test_id: i64, ) -> Result<(), Box<dyn std::error::Error>> { let mut transaction = pool.begin().await?; insert_and_verify(&mut transaction, test_id).await?; transaction.commit().await?; Ok(()) } #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let conn_str = std::env::var("DATABASE_URL").expect("Env var DATABASE_URL is required for this example."); let pool = sqlx::PgPool::connect(&conn_str).await?; let test_id = 1; // remove any old values that might be in the table already with this id from a previous run let _ = query!(r#"DELETE FROM todos WHERE id = $1"#, test_id) .execute(&pool) .await?; explicit_rollback_example(&pool, test_id).await?; // check that inserted todo is not visible outside the transaction after explicit rollback let inserted_todo = query!(r#"SELECT FROM todos WHERE id = $1"#, test_id) .fetch_one(&pool) .await; assert!(inserted_todo.is_err()); implicit_rollback_example(&pool, test_id).await?; // check that inserted todo is not visible outside the transaction after implicit rollback let inserted_todo = query!(r#"SELECT FROM todos WHERE id = $1"#, test_id) .fetch_one(&pool) .await; assert!(inserted_todo.is_err()); commit_example(&pool, test_id).await?; // check that inserted todo is visible outside the transaction after commit let inserted_todo = query!(r#"SELECT FROM todos WHERE id = $1"#, test_id) .fetch_one(&pool) .await; assert!(inserted_todo.is_ok()); Ok(()) }