如何在SQLX for Rust中构建和提交多查询事务?

问题描述

sqlx中有一个事务,可让您在一个事务中运行多个查询。

尽管有自动生成的API文档,但我试图弄清楚如何做到这一点,但可惜的是没有记录。

我的第一次尝试:

async fn insert_user() {
    let pool: sqlx::Pool<sqlx::MySql> =
        futures::executor::block_on(crate::db::open_mariadb_pool()).unwrap();
    use sqlx::Acquire;
    let mut conn = pool.acquire().await.unwrap();
    let tx = conn.begin().await.unwrap();
    let insert_query = sqlx::query("INSERT INTO user (email,email_verification_secret,email_verified,password_hash,hourly_rate)
VALUES (?,?,?);"
    )
        .bind("text@example.com")
        .bind(false)
        .bind(123)
        .bind("pwhash")
        .bind(20);
    let get_row_query = sqlx::query::<sqlx::MySql>("SELECT * FROM user WHERE id = LAST_INSERT_ID();");
    insert_query.execute(tx);
    get_row_query.execute(tx);
    tx.commit();
}

产生以下错误:

error[E0277]: the trait bound `Transaction<'_,MySql>: Executor<'_>` is not satisfied
  --> src/controller_user.rs:86:26
   |
86 |     insert_query.execute(tx);
   |                          ^^ the trait `Executor<'_>` is not implemented for `Transaction<'_,MySql>`
   |
   = help: the following implementations were found:
             <&'t mut Transaction<'c,MySql> as Executor<'t>>

error[E0277]: the trait bound `Transaction<'_,MySql>: Executor<'_>` is not satisfied
  --> src/controller_user.rs:87:27
   |
87 |     get_row_query.execute(tx);
   |                           ^^ the trait `Executor<'_>` is not implemented for `Transaction<'_,MySql> as Executor<'t>>

我真的不知道从哪里开始考虑这个问题-但未能从自动生成的API文档中找到。感谢您阅读我的问题:-)。

解决方法

函数tests/mssql/mssql.rs中的测试it_can_work_with_transactions中有一个用法示例。

用法似乎是:

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

    sqlx::query("INSERT INTO _sqlx_users_1922 (id) VALUES (@p1)")
        .bind(10_i32)
        .execute(&mut tx)
        .await?;

    tx.commit().await?;

您正在执行的操作与此代码之间唯一明显的区别是传递了可变引用,而不是将值作为execute的参数。

考虑到这一点,如果我们仔细查看您的错误消息,那正是它的意思。用...替换一些位后,仅保留其读取的内容

... the trait `Executor<...>` is not implemented for `Transaction<...>`
   |
... the following implementations were found:
             &mut Transaction<...> as Executor<...>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...