如何用SurrealDB Rust SDK插入含已有Category关联的Product
在SurrealDB Rust SDK中正确关联已有Category到Product的方案
你当前的代码问题在于直接传入Category结构体,这会让SurrealDB新建一条category记录,而不是关联已存在的条目。因为record<category>类型需要的是已存在记录的引用,也就是SurrealDB中的Thing类型(用来标识特定表的特定记录)。
解决方案步骤:
调整结构体定义
将Product中的category字段类型改为surrealdb::sql::Thing,同时给Category结构体加上id字段(方便查询后获取记录引用):use surrealdb::sql::Thing; use serde::{Serialize, Deserialize}; use surrealdb::error::Error; use surrealdb::Surreal; use surrealdb::engine::any::Any; #[derive(Debug, Serialize, Deserialize)] pub struct Product { pub name: String, pub qty: i64, pub price: f64, pub category: Thing, } #[derive(Debug, Serialize, Deserialize)] pub struct Category { pub id: Thing, pub name: String, }查询已存在的Category并关联
先通过查询获取目标Category的Thing引用,再将其传入Product的创建逻辑:pub async fn create_product(db: &Surreal<Any>) -> Result<(), Error> { // 根据name查询已存在的category let categories: Vec<Category> = db .query("SELECT * FROM category WHERE name = $name") .bind(("name", "Equity")) .await? .take(0)?; // 确保找到目标category let target_category = categories.first().ok_or(Error::from("指定的Category不存在"))?; // 创建Product并关联已存在的category let _: Option<Product> = db .create("product") .content(Product { name: "Banana".to_string(), qty: 100, price: 5.45, category: target_category.id.clone(), }) .await?; println!("Product创建成功并关联到已有Category"); Ok(()) }
额外说明
- 如果已经知道Category的ID,可以直接构造
Thing,无需查询:// 假设category的ID是"equity_123" let category_thing = Thing::from(("category", "equity_123")); - 若之前尝试
Thing未成功,大概率是结构体字段类型未正确设置,或是没有正确获取到已有记录的Thing引用。
内容的提问来源于stack exchange,提问作者eric paris
相关产品推荐
相关产品推荐

