execute(&mut *transaction) 与execute(&mut transaction)

问题描述 投票:0回答:1

我很好奇在我的例子中

execute(&mut *transaction)
execute(&mut transaction)
之间有什么区别,因为我不认为
transaction
是一个开始的指针,但由于某种原因
execute(&mut *transaction)
满足特征点,而
execute(&mut transaction) 
没有。

这是我使用后一种语法时遇到的错误:

rustc: the trait bound `&mut sqlx::Transaction<'_, sqlx::Postgres>: sqlx::Executor<'_>` is not satisfied
the following other types implement trait `sqlx::Executor<'c>`:
  <&'c mut sqlx::PgConnection as sqlx::Executor<'c>>
  <&'c mut sqlx::sqlx_postgres::PgListener as sqlx::Executor<'c>>
  <&'c mut sqlx::AnyConnection as sqlx::Executor<'c>>
  <&sqlx::Pool<DB> as sqlx::Executor<'p>> [E0277]
rustc: required by a bound introduced by this call [E0277]

这是否归结为进行某种类型转换?很好奇这是否会被视为一种限制,或者编译器认为这两个表达式是不同的对象是否确实有意义。

use sqlx::{PgPool, Transaction, Executor};
use chrono::{DateTime, Utc};

pub struct SimpleDbClient {
    db: PgPool,
}

pub trait AddCharacterEntries {
    async fn insert_character_entries(&self, timestamp: DateTime<Utc>, char_values: Vec<(char, i32)>) -> sqlx::Result<()>;
}

impl AddCharacterEntries for SimpleDbClient {
    async fn insert_character_entries(&self, timestamp: DateTime<Utc>, char_values: Vec<(char, i32)>) -> sqlx::Result<()> {
        let mut transaction = self.db.begin().await?;
        for (character, ascii_value) in char_values {
            sqlx::query!(
                r#"
                INSERT INTO character_log (timestamp, character, ascii_value)
                VALUES ($1, $2, $3)
                "#,
                timestamp,
                character as char,
                ascii_value
            )
            .execute(&mut *transaction)
            .await?;
        }
        transaction.commit().await?;
        Ok(())
    }
}
rust types
1个回答
0
投票

您缺少的是

Transaction
实现
Deref
DerefMut
。当您尝试对实现
Deref
的值调用方法时,Rust 可以通过这些特征自动取消引用,但您也可以使用
*
运算符显式取消引用。然后
&mut
获取对此值的引用,在本例中是
PgConnection

sqlx 实现这些特征的方式允许您在

Transaction
值上调用底层数据库连接的任何(非消耗)方法。

© www.soinside.com 2019 - 2024. All rights reserved.