You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:21:12