Rust diesel中的显式连接

Rust diesel中的显式连接,rust,rust-diesel,Rust,Rust Diesel,我有两个表,我只想连接、筛选和选择Diesel中的特定列: contest_用户::dsl::contest_用户 .内部连接( 竞赛::表.on(竞赛用户::竞赛id.eq(竞赛::竞赛id)), ) .filter(竞赛用户::用户id.eq(42)) .select((竞赛::列::竞赛id,) 下面是一个示例(请参见代码中的注释) 我已经找到了一些可以编译的解决方案,但我仍然想知道是否可以在不使用joinable的情况下命名这种查询的类型 以下内容是可编译的: pub fn join_

我有两个表,我只想连接、筛选和选择Diesel中的特定列:

contest_用户::dsl::contest_用户
.内部连接(
竞赛::表.on(竞赛用户::竞赛id.eq(竞赛::竞赛id)),
)
.filter(竞赛用户::用户id.eq(42))
.select((竞赛::列::竞赛id,)
下面是一个示例(请参见代码中的注释)

我已经找到了一些可以编译的解决方案,但我仍然想知道是否可以在不使用
joinable的情况下命名这种查询的类型

以下内容是可编译的:

pub fn join_and_filter()->diesel::dsl::filter<
柴油机::dsl::选择<
diesel::dsl::InnerJoin,
(竞赛::列::竞赛编号,),
>,
diesel::表达式::运算符::Eq<
竞赛用户::列::用户id,
diesel::表达式::绑定::绑定,
>,
> {
可加入!(竞赛用户->竞赛(竞赛id));
竞赛用户::dsl::竞赛用户
.内部连接(
竞赛::table.on(竞赛用户::竞赛id.nullable().eq(竞赛::竞赛id.nullable()),
)
.filter(竞赛用户::用户id.eq(42))
.select((竞赛::列::竞赛id,)
}
而以下(即使我有显式的
.on()
),也没有可连接的
)会导致编译错误:

pub fn join_and_filter()->diesel::dsl::filter<
柴油机::dsl::选择<
diesel::dsl::InnerJoin,
(竞赛::列::竞赛编号,),
>,
diesel::表达式::运算符::Eq<
竞赛用户::列::用户id,
diesel::表达式::绑定::绑定,
>,
> {
竞赛用户::dsl::竞赛用户
.内部连接(
竞赛::表.on(竞赛用户::竞赛id.eq(竞赛::竞赛id))
)
.filter(竞赛用户::用户id.eq(42))
.select((竞赛::列::竞赛id,)
}
error[E0277]:特性绑定'contest_users::table:JoinTo'不满足
-->src/main.rs:69:1
|
69 |/pub fn join_and_filter()->diesel::dsl::filter<
70 | |柴油机::dsl::选择<
71 | | diesel::dsl::InnerJoin,
72 | |(竞赛::专栏::竞赛| id,),
...  |
84 | |。选择((竞赛::列::竞赛id,)
85 | | }
|| ^未为'contest_users::table'实现特征'JoinTo'`
|
=帮助:找到了以下实现:
我已经找到了一些可以编译的解决方案,但我仍然想知道是否可以在不使用joinable!的情况下命名此查询的类型

根据文件规定,定义如下:

输入InnerJoin=::输出;
这和声明

表示.internal_join(rhs)的返回类型

指示此类型设计用于不带显式
on
子句的
内部join
语句

现在,这就引出了如何正确指定返回类型的问题,因为diesel 1.4没有通过
diesel::dsl
导出相应的类型。diesels master branch的文档表明存在相应的类型定义,但构成类型定义的相关类型未作为公共API的一部分在1.4版本中公开。这表明目前无法使用现有的diesel版本命名此类型

error[E0277]: the trait bound `contest_users::table: JoinTo<contests::table>` is not satisfied
  --> src/main.rs:69:1
   |
69 | / pub fn join_and_filter() -> diesel::dsl::Filter<
70 | |     diesel::dsl::Select<
71 | |         diesel::dsl::InnerJoin<contest_users::table, contests::table>,
72 | |         (contests::columns::contest_id,),
...  |
84 | |         .select((contests::columns::contest_id,))
85 | | }
   | |_^ the trait `JoinTo<contests::table>` is not implemented for `contest_users::table`
   |
   = help: the following implementations were found:
             <contest_users::table as JoinTo<JoinOn<Join, On>>>
             <contest_users::table as JoinTo<diesel::query_builder::BoxedSelectStatement<'a, QS, ST, DB>>>
             <contest_users::table as JoinTo<diesel::query_builder::SelectStatement<F, S, D, W, O, L, Of, G>>>
             <contest_users::table as JoinTo<diesel::query_source::joins::Join<Left, Right, Kind>>>
   = note: required because of the requirements on the impl of `JoinWithImplicitOnClause<contests::table, Inner>` for `contest_users::table`