7

我正在尝试使用 SQLX 在 Rust 中开发一个应用服务器作为后端存储。它适用于具有一些特殊默认行为的原始 CMS,即:如果找不到页面,则使用一些空白内容自动生成它。我希望能够重用调用 SQL 的函数,所以我希望它们采用实现sqlx::Executor特征的类型,包括&mut sqlx::Connection&mut sqlx::pool::PoolConnection&mut sqlx::Transaction.

每个调用数据库的函数都很好用

但是,似乎我无法重用执行程序。在我确定页面不存在后调用此函数;我创建了一个事务并使用 an&mut Transaction作为e参数调用它:

async fn create_page_for_title(e: impl Executor<'_, Database = Sqlite>, title: &str) -> SqlResult<RawPage> {
    let newcontent_id = insert_new_root_content(e).await?;
    let newpage = insert_new_page(e, title, newcontent_id).await?;
    Ok(newpage)
}

这就是 Rust (1.46) 所说的:

Error[E0382]: use of moved value: `e`
   --> src/store.rs:239:30
    |
230 | async fn create_page_for_title(e: impl Executor<'_, Database = Sqlite>, title: &str) -> SqlResult<RawPage>
    |                                - move occurs because `e` has type `impl Executor<'_, Database = Sqlite>`, which does not implement the `Copy` trait
...
238 |     let newcontent_id = insert_new_root_content(e).await?;
    |                                                 - value moved here
239 |     let newpage = insert_new_page(e, title, newcontent_id).await?;
    |                                   ^ value used here after move

我知道e是参考,参考是Copy. 但我似乎无法让 Rust 相信这一点,我也不知道为什么。这是我在同一范围内使用impl Executor两次的唯一功能,但我相信随着时间的推移我会发现更多。请帮忙?

4

0 回答 0