我正在尝试使用 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
两次的唯一功能,但我相信随着时间的推移我会发现更多。请帮忙?