求助:如何在Rust中编写异步函数以保存SurrealDB记录
求助:如何在Rust中编写异步函数以保存SurrealDB记录
兄弟我太懂你这种挫败感了!之前用别的语言写个数据保存分分钟搞定,到Rust这儿因为异步、所有权这些玩意儿卡壳,真的让人头大😮💨 我当初刚啃SurrealDB异步操作的时候也踩过不少坑,给你捋个最接地气的实现方法,你跟着改就行:
首先,先把依赖给配对,Cargo.toml里得把需要的包都加上,尤其是异步相关的特性:
[package] name = "surreal_async_demo" version = "0.1.0" edition = "2021" [dependencies] surrealdb = { version = "1.0", features = ["kv-rocksdb", "async"] } tokio = { version = "1.0", features = ["full"] } serde = { version = "1.0", features = ["derive"] }
接下来,咱们一步步写代码:
- 首先定义要保存的结构体,得能被序列化/反序列化,这样SurrealDB才能处理:
use serde::{Deserialize, Serialize}; use surrealdb::{engine::rocksdb::RocksDb, Surreal, Result, sql::Thing}; #[derive(Debug, Serialize, Deserialize)] struct User { id: Option<Thing>, // 可选ID,插入时数据库会自动生成 name: String, email: String, }
- 然后写核心的异步保存函数,这里要注意数据库实例的传递,因为Rust的所有权规则,咱们传引用就行(如果是多线程场景,后面可以换成
Arc<Surreal<RocksDb>>,新手先从简单的来):
async fn save_user(db: &Surreal<RocksDb>, user: User) -> Result<User> { // 调用SurrealDB的create方法插入记录,自动返回保存后的实例 let saved_user = db.create("user").content(user).await?; Ok(saved_user) }
- 最后在异步的main函数里调用这个保存函数,记得用tokio的main宏来启动异步运行时:
#[tokio::main] async fn main() -> Result<()> { // 初始化RocksDB连接,异步操作要加await let db = Surreal::new::<RocksDb>("./my_local_db").await?; // 设置命名空间和数据库,这步也得await db.use_ns("my_namespace").use_db("my_database").await?; // 构造要保存的用户数据 let new_user = User { id: None, name: "李四".to_string(), email: "lisi@test.com".to_string(), }; // 调用保存函数,处理结果 let saved_user = save_user(&db, new_user).await?; println!("记录保存成功!结果: {:?}", saved_user); Ok(()) }
新手容易踩的几个坑我给你提个醒:
- 所有异步操作后面必须加
await,不然代码根本不会执行,只会返回一个Future对象 - 数据库实例的所有权别乱移,传引用或者用Arc来共享,不然会编译报错
- 结构体一定要加
Serialize和Deserializederive宏,不然SurrealDB没法把数据转成它能存的格式
备注:内容来源于stack exchange,提问作者jxbb
相关产品推荐
相关产品推荐

