在sqlx中有一个Transaction
类型,它允许你在一个事务中运行多个查询。
我试图弄清楚如何做到这一点,遗憾的是没有文档,尽管有自动生成的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("[email protected]")
.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>`
|
= help: the following implementations were found:
<&'t mut Transaction<'c, MySql> as Executor<'t>>
型
我真的不知道从哪里开始思考这个问题-但我无法从自动生成的API文档中找到答案。
2条答案
按热度按时间kq4fsx7k1#
在函数
it_can_work_with_transactions
中的测试tests/mssql/mssql.rs
中有一个示例用法。用法似乎是:
字符串
您正在做的事情和这段代码之间唯一明显的区别是传递一个可变引用,而不是将值作为参数传递给
execute
。考虑到这一点,如果我们仔细看你的错误消息,这正是它所说的。在用.
型
velaa5lx2#
要更新此答案,版本7.0现在需要
字符串
https://github.com/launchbadge/sqlx/blob/main/examples/postgres/transaction/src/main.rs