SurrealDB:如何在Rust结构体中存储记录关联?
在Rust中存储SurrealDB的Record关联类型
针对你的场景,有两种常用方式处理record(user)类型的字段:
1. 使用官方提供的Thing类型(推荐)
SurrealDB的Rust客户端内置了Thing类型,专门用来表示数据库中的记录引用,完美匹配schema里的record(user)类型。
示例代码
use surrealdb::sql::Thing; use serde::{Serialize, Deserialize}; #[derive(Debug, Serialize, Deserialize)] struct Notification { content: String, user_id: Thing, }
Thing类型包含两个核心属性:
tb(): 获取关联的表名(此处为user)id(): 获取记录的ID值(类型为&str,可转换为String使用)
查询notification表时,客户端会自动将user_id字段反序列化为Thing实例,直接对应数据库中的记录引用。
2. 自定义Record结构体
如果你希望类型更明确,也可以自定义包含id字段的结构体来表示用户记录引用:
示例代码
use serde::{Serialize, Deserialize}; #[derive(Debug, Serialize, Deserialize)] struct UserRecord { id: String, } #[derive(Debug, Serialize, Deserialize)] struct Notification { content: String, user_id: UserRecord, }
这种方式适合后续需要扩展用户记录字段的场景,但要注意ID类型需和数据库中user表的ID类型一致(比如用UUID的话,就把String换成uuid::Uuid)。
额外说明:获取完整关联数据
如果查询需要直接获取user表的完整数据,而非仅记录引用,可以在查询时使用FETCH语句:
SELECT *, user_id.* FROM notification FETCH user_id;
对应的Rust结构体可定义为:
#[derive(Debug, Serialize, Deserialize)] struct User { id: Thing, // 添加user表的其他字段 } #[derive(Debug, Serialize, Deserialize)] struct Notification { content: String, user_id: User, }
内容的提问来源于stack exchange,提问作者eminfedar
相关产品推荐
相关产品推荐

