在下面的代码中我收到此错误:
error[E0599]: no method named `commit` found for mutable reference `&mut sqlx::PgConnection` in the current scope
--> src/main.rs:103:12
|
103 | db.commit().await?;
| ^^^^^^ method not found in `&mut PgConnection`
db
如果是,我需要提交,None
因为我正在开始一个新的交易:&mut self.pool.begin().await?
。
可以用作db: Option<&mut sqlx::PgConnection>
参数类型吗?还是我应该使用其他东西,例如Acquire
特征?
pub async fn find_player_id(
&self,
db: Option<&mut sqlx::PgConnection>,
id: &str,
team_id: &str,
) -> Result<String, Error> {
let db = match db {
Some(db) => db,
None => &mut self.pool.begin().await?,
};
let _ = self.team_service.find_team_id(Some(db), team_id).await?;
let player_id = self.repo.find_player_id(Some(db), id).await?;
db.commit().await?;
Ok(player_id)
}
更新:
SO 上的某个人关闭了这个问题,因为他们认为这与“为什么我需要导入特征才能使用它为某种类型定义的方法?”重复。
我认为不是。请在采取行动之前先阅读问题。
确实,特征必须在范围内才能使用其方法。提供的特征
commit
是AnyConnectionBackend
。但是,此特征需要any
启用该功能,您可以使用禁用该default-features = false
功能。因此,只需将功能添加any
到sqlx
,然后添加use sqlx::postgres::any::AnyConnectionBackend;
。(any
禁用后,rust-analyzer 甚至找不到AnyConnectionBackend
以建议导入它。)