如何解决如何在SQLX for Rust中构建和提交多查询事务?
尽管有自动生成的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<...>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。