gpt4 book ai didi

rust - 关系的渴望

转载 作者:行者123 更新时间:2023-12-03 11:34:45 25 4
gpt4 key购买 nike

我有以下三种关系模型:
艺术家1 <-> n歌曲1 <-> n播放
我想加载剧本,并热切地加载它的歌曲和艺术家。
我很容易在PHP框架Eloquent中做到了这一点。而且它仅需要3个DB请求(每个模型一个)。
柴油有可能吗?
我认为Play模型应如下所示:

#[derive(Queryable, Serialize, Deserialize)]
pub struct Play {
pub id: u64,
pub song_id: u64,
pub song: Song, // <-- ????
pub date: NaiveDateTime,
pub station_id: u64,
}
并加载这样的东西:
// loads one model only at the moment
// it should load the related models Song and Artist too
let items = plays.filter(date.between(date_from, date_to)).load(&*conn)?;
生成的结构应进行JSON序列化,以供REST API使用。但是我找不到一种简单有效的方法来获取所需的结构。

最佳答案

首先:如果您在线发布有关柴油的问题,请始终包含架构的相关部分,否则其他人需要猜测其外观。
我将为您的问题采用以下模式:

table! {
plays (id)
id -> BigInt,
song_id -> BigInt,
date -> Timestamp,
station_id -> BigInt,
}

}

table! {
songs(id) {
id -> BigInt,
name -> Text,
}
}

joinable!(plays -> songs (song_id));
现在,您的 Play结构存在一些问题。 u64不是柴油支持的类型。 checkout this文档,以了解哪些类型与 BigInt SQL类型兼容。
这意味着我将假设以下结构实现 Queryable:
#[derive(Queryable, Serialize, Deserialize)]
pub struct Play {
pub id: i64,
// pub song_id: u64, leave this out as it is a duplicate with `song` below
pub song: Song,
pub date: NaiveDateTime,
pub station_id: i64,
}

#[derive(Queryable, Serialize, Deserialize)]
pub struct Song {
pub id: i64,
pub name: String,
}
现在来回答您的核心问题:首先,柴油机没有像其他ORM所知道的那样具有单一模型的概念。如果您曾经使用过这样的东西,请不要尝试将这些知识应用于柴油,它不会起作用。有一组特征描述每个结构的功能。当我们在这里谈论查询时,我将专注于 QueryableQueryable旨在将查询结果(可能包括零个,一个或多个表)映射到rust数据结构。默认情况下(通过使用 derive),它通过映射结构字段来做到这一点,这意味着您的select子句需要匹配派生 Queryable的结构。
现在回到您的具体问题。这意味着我们必须构造一个返回 (i64, (i64, String), NaiveDateTime, i64)的查询(或者更好的是返回具有相应SQL类型的字段)。
对于这种情况,这就像使用单个联接一样简单:
plays::table.inner_join(songs::table)
.select((plays::id, songs::all_columns, plays::date, plays::station_id))

对于映射,这里唯一重要的是select子句。您可以附加/添加您喜欢的其他 QueryDsl方法。

关于rust - 关系的渴望,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65870187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com