Rust 急切地加载关系

Rust 急切地加载关系,rust,orm,eager-loading,rust-diesel,Rust,Orm,Eager Loading,Rust Diesel,我有三个模型与这些关系: 艺术家1n歌曲1n戏剧 我想加载剧本,急切地加载它的歌曲和艺术家 我在PHP框架中轻松地做到了这一点。而且每个模型只需要3个DB请求 这是柴油机怎么可能做到的 我认为游戏模型应该是这样的: [可派生查询、序列化、反序列化] 酒吧结构剧{ 酒吧编号:u64, 酒吧歌号:u64, pub-song:song,//实现这一点的一种方法是连接其他两个表。不幸的是,我没有找到避免枚举所有表字段的方法。这不是一个优雅的解决方案,但它应该可以工作 fn select_plays_wi

我有三个模型与这些关系:

艺术家1n歌曲1n戏剧

我想加载剧本,急切地加载它的歌曲和艺术家

我在PHP框架中轻松地做到了这一点。而且每个模型只需要3个DB请求

这是柴油机怎么可能做到的

我认为游戏模型应该是这样的:

[可派生查询、序列化、反序列化] 酒吧结构剧{ 酒吧编号:u64, 酒吧歌号:u64,
pub-song:song,//实现这一点的一种方法是连接其他两个表。不幸的是,我没有找到避免枚举所有表字段的方法。这不是一个优雅的解决方案,但它应该可以工作

fn select_plays_with_song_and_artist(
    conn: &Conn,
    date_from: NaiveDate,
    date_to: NaiveDate,
) -> Result<Vec<(models::Play, models::Song, models::Artist)>> {
    plays::table                
    .filter(plays::date.between(date_from, date_to))               
    .join(songs::table.join(artists::table))                                             
    .select((                                                               
        (
            plays::id,  
            plays::song_id,     
            plays::date,     
            plays::station_id,                                      
        ),
        (
            songs::id,
            // other relevant fields...
        ),
        (
            artist::id,
            // other relevant fields...
        ),
     ))                                                                           
     .load::<(models::Play, models::Song, models::Artist)>(conn)
}

首先:如果你在网上发布一个关于diesel的问题,请始终包括你的模式的相关部分,否则其他人需要猜测它是什么样子。 对于您的问题,我将采用以下模式:

桌子{ 播放id id->BigInt, song_id->BigInt, 日期->时间戳, 车站id->BigInt, } } 桌子{ 宋希德{ id->BigInt, 名称->文本, } } 可接合!播放->歌曲歌曲id; 现在,您的Play结构出现了一些问题。u64不是柴油机支持的类型。有关哪些类型与BigInt SQL类型兼容的签出文档。 这意味着我将假设以下结构实现Queryable:

[可派生查询、序列化、反序列化] 酒吧结构剧{ 酒吧id:i64, //pub song_id:u64,省去这个,因为它是一个重复的,下面有'song' 酒吧歌:歌, 发布日期:NaiveDateTime, 酒吧地址:i64, } [可派生查询、序列化、反序列化] 酒吧结构歌{ 酒吧id:i64, 酒吧名称:String, } 现在来谈谈你的核心问题:首先,diesel没有像其他ORM那样的单一模型的概念。如果你曾经使用过这样的东西,不要试图将这些知识应用到柴油机上,它不会起作用。有一组特征描述每个结构的功能。当我们在这里讨论查询时,我将集中讨论Queryable。Queryable用于将可能包含零个、一个或多个表的查询结果映射到一个数据结构。默认情况下,通过使用派生,它通过映射结构字段来实现这一点,这意味着您的select子句需要匹配派生Queryable的结构。 现在回到你的具体问题上来。这意味着我们必须构造一个查询,返回具有相应SQL类型的i64、i64、String、NaiveDateTime、i64或更好的字段。 对于这种情况,这与使用单个联接一样简单:

播放::表格。内部歌曲::表格 .选择播放::id,歌曲::所有列,播放::日期,播放::电台\U id
这里映射的唯一重要内容是select子句。您可以附加/前置任何您喜欢的QueryDsl方法。

我在diesel文档中找到了类似的解决方案。所有这些的问题是,我必须在第二步中构建我的结构。我需要一个RESTAPI。但似乎无法在一次运行中实现这一点。这通常可以通过将所有内容放入结构中,然后对结构的某些部分使用[serdeflatten]来解决。因此,我的模型使用了外来ID和查询向量。然后我将结果映射到另一个包含引用模型的模型,而不是ID:FullPlay{…,song:FullSong,…}。对吗?我现在是这样做的。给我所需的结果,比预期的快。