Diesel: Documentation for multi-table inner join is confusing

Created on 25 Aug 2017  ·  6Comments  ·  Source: diesel-rs/diesel

Setup

I have a repo demonstrating this problem here: https://github.com/carols10cents/diesel-inner-join-mvce

Versions

  • Rust: stable 1.19.0
  • Diesel: 0.16.0
  • Database: postgres 9.6.1
  • Operating System macOS Sierra

Feature Flags

  • diesel: postgres
  • diesel_codegen: postgres

Problem Description

What are you trying to accomplish?

I have these tables:

#[derive(Debug, Clone, Queryable, Identifiable, Associations, AsChangeset)]
pub struct Crate {
    pub id: i32,
    pub name: String,
}

#[derive(Clone, Identifiable, Queryable, Associations, Debug)]
#[belongs_to(Crate)]
pub struct Version {
    pub id: i32,
    pub crate_id: i32,
}

#[derive(Insertable, Identifiable, Queryable, Associations, Debug)]
#[belongs_to(Version)]
#[table_name = "readme_rendering"]
#[primary_key(version_id)]
struct ReadmeRendering {
    version_id: i32,
    rendered_at: String,
}

And I would like to write diesel that generates the equivalent of:

SELECT * FROM versions
    INNER JOIN readme_rendering ON versions.id = readme_rendering.version_id
    INNER JOIN crates ON versions.crate_id = crates.id;

This looks similar to the example with users, posts, and comments in the docs that says users.inner_join(posts).inner_join(comments) generates this sql:

SELECT * FROM users
    INNER JOIN posts ON posts.user_id = users.id
    INNER JOIN comments ON comments.user_id = users.id

So I have this query:

    let versions_to_readme_and_crates_doesnt_work = versions::table
        .inner_join(readme_rendering::table)
        .inner_join(crates::table)
        .select((versions::all_columns, readme_rendering::rendered_at, crates::name))
        .load::<(Version, Option<String>, Option<String>)>(&conn)
        .expect("error loading versions_to_readme_and_crates_doesnt_work");

What is the expected output?

I expect this to compile and run the sql above.

What is the actual output?

I get this compilation error, which seems to indicate diesel is trying to join crates and readme_rendering?

error[E0277]: the trait bound `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table: diesel::JoinTo<__diesel_infer_schema::infer_crates::crates::table>` is not satisfied
  --> src/main.rs:62:10
   |
62 |         .inner_join(crates::table)
   |          ^^^^^^^^^^ the trait `diesel::JoinTo<__diesel_infer_schema::infer_crates::crates::table>` is not implemented for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table`

Full errors behind toggle:

error[E0277]: the trait bound `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table: diesel::JoinTo<__diesel_infer_schema::infer_crates::crates::table>` is not satisfied
  --> src/main.rs:62:10
   |
62 |         .inner_join(crates::table)
   |          ^^^^^^^^^^ the trait `diesel::JoinTo<__diesel_infer_schema::infer_crates::crates::table>` is not implemented for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table`
   |
   = help: the following implementations were found:
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_source::joins::Join<Left, Right, Kind>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_source::joins::JoinOn<Join, On>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_builder::SelectStatement<F, S, D, W, O, L, Of, G>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_builder::BoxedSelectStatement<'a, QS, ST, DB>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<__diesel_infer_schema::infer_versions::versions::table>>
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` for `__diesel_infer_schema::infer_crates::crates::table`
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` for `diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `(__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id, __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at)`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), (__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id, __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at), (__diesel_infer_schema::infer_crates::crates::columns::id, __diesel_infer_schema::infer_crates::crates::columns::name))`
   = note: required because of the requirements on the impl of `diesel::QuerySource` for `diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::QuerySource` for `diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>`
   = note: required because of the requirements on the impl of `diesel::query_builder::select_clause::SelectClauseExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `diesel::query_builder::select_clause::DefaultSelectClause`
   = note: required because of the requirements on the impl of `diesel::query_builder::Query` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
   = note: required because of the requirements on the impl of `diesel::query_builder::AsQuery` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
   = note: required because of the requirements on the impl of `diesel::InternalJoinDsl<__diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>>`
error[E0277]: the trait bound `__diesel_infer_schema::infer_crates::crates::table: diesel::JoinTo<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` is not satisfied
  --> src/main.rs:62:10
   |
62 |         .inner_join(crates::table)
   |          ^^^^^^^^^^ the trait `diesel::JoinTo<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` is not implemented for `__diesel_infer_schema::infer_crates::crates::table`
   |
   = help: the following implementations were found:
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_source::joins::Join<Left, Right, Kind>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_source::joins::JoinOn<Join, On>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_builder::SelectStatement<F, S, D, W, O, L, Of, G>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_builder::BoxedSelectStatement<'a, QS, ST, DB>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<__diesel_infer_schema::infer_versions::versions::table>>
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_crates::crates::table>` for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table`
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_crates::crates::table>` for `diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_crates::crates::table>` for `diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `__diesel_infer_schema::infer_crates::crates::columns::id`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `(__diesel_infer_schema::infer_crates::crates::columns::id, __diesel_infer_schema::infer_crates::crates::columns::name)`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), (__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id, __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at), (__diesel_infer_schema::infer_crates::crates::columns::id, __diesel_infer_schema::infer_crates::crates::columns::name))`
   = note: required because of the requirements on the impl of `diesel::QuerySource` for `diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::QuerySource` for `diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>`
   = note: required because of the requirements on the impl of `diesel::query_builder::select_clause::SelectClauseExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `diesel::query_builder::select_clause::DefaultSelectClause`
   = note: required because of the requirements on the impl of `diesel::query_builder::Query` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
   = note: required because of the requirements on the impl of `diesel::query_builder::AsQuery` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
   = note: required because of the requirements on the impl of `diesel::InternalJoinDsl<__diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>>`

error[E0277]: the trait bound `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table: diesel::JoinTo<__diesel_infer_schema::infer_crates::crates::table>` is not satisfied
  --> src/main.rs:63:10
   |
63 |         .select((versions::all_columns, readme_rendering::rendered_at, crates::name))
   |          ^^^^^^ the trait `diesel::JoinTo<__diesel_infer_schema::infer_crates::crates::table>` is not implemented for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table`
   |
   = help: the following implementations were found:
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_source::joins::Join<Left, Right, Kind>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_source::joins::JoinOn<Join, On>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_builder::SelectStatement<F, S, D, W, O, L, Of, G>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<diesel::query_builder::BoxedSelectStatement<'a, QS, ST, DB>>>
             <__diesel_infer_schema::infer_readme_rendering::readme_rendering::table as diesel::JoinTo<__diesel_infer_schema::infer_versions::versions::table>>
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` for `__diesel_infer_schema::infer_crates::crates::table`
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` for `diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)`
   = note: required because of the requirements on the impl of `diesel::query_builder::select_clause::SelectClauseExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>`
   = note: required because of the requirements on the impl of `diesel::SelectDsl<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`

error[E0277]: the trait bound `__diesel_infer_schema::infer_crates::crates::table: diesel::JoinTo<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` is not satisfied
  --> src/main.rs:63:10
   |
63 |         .select((versions::all_columns, readme_rendering::rendered_at, crates::name))
   |          ^^^^^^ the trait `diesel::JoinTo<__diesel_infer_schema::infer_readme_rendering::readme_rendering::table>` is not implemented for `__diesel_infer_schema::infer_crates::crates::table`
   |
   = help: the following implementations were found:
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_source::joins::Join<Left, Right, Kind>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_source::joins::JoinOn<Join, On>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_builder::SelectStatement<F, S, D, W, O, L, Of, G>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<diesel::query_builder::BoxedSelectStatement<'a, QS, ST, DB>>>
             <__diesel_infer_schema::infer_crates::crates::table as diesel::JoinTo<__diesel_infer_schema::infer_versions::versions::table>>
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_crates::crates::table>` for `__diesel_infer_schema::infer_readme_rendering::readme_rendering::table`
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_crates::crates::table>` for `diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_crates::crates::table>` for `diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>`
   = note: required because of the requirements on the impl of `diesel::query_source::AppearsInFromClause<__diesel_infer_schema::infer_crates::crates::table>` for `diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>>` for `__diesel_infer_schema::infer_crates::crates::columns::name`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `__diesel_infer_schema::infer_crates::crates::columns::name`
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)`
   = note: required because of the requirements on the impl of `diesel::query_builder::select_clause::SelectClauseExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>` for `diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>`
   = note: required because of the requirements on the impl of `diesel::SelectDsl<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>` for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`

error[E0599]: no method named `load` found for type `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>>` in the current scope
  --> src/main.rs:64:10
   |
64 |         .load::<(Version, Option<String>, Option<String>)>(&conn)
   |          ^^^^
   |
   = note: the method `load` exists but the following trait bounds were not satisfied:
           `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::AsQuery`
           `_ : diesel::query_builder::QueryFragment<_>`
           `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`
           `diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)> : diesel::query_builder::select_clause::SelectClauseExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
           `((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name) : diesel::SelectableExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
           `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`
           `&diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::AsQuery`
           `_ : diesel::query_builder::QueryFragment<_>`
           `&diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`
           `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`
           `diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)> : diesel::query_builder::select_clause::SelectClauseExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
           `((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name) : diesel::SelectableExpression<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>>`
           `&diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`
           `&mut diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::AsQuery`
           `_ : diesel::query_builder::QueryFragment<_>`
           `_ : diesel::query_builder::QueryId`
           `&mut diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`
           `&mut diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`
           `&mut diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<__diesel_infer_schema::infer_versions::versions::table, __diesel_infer_schema::infer_readme_rendering::readme_rendering::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::version_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::id>>>, __diesel_infer_schema::infer_crates::crates::table, diesel::query_source::joins::Inner>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_versions::versions::columns::crate_id>, diesel::expression::nullable::Nullable<__diesel_infer_schema::infer_crates::crates::columns::id>>>, diesel::query_builder::select_clause::SelectClause<((__diesel_infer_schema::infer_versions::versions::columns::id, __diesel_infer_schema::infer_versions::versions::columns::crate_id), __diesel_infer_schema::infer_readme_rendering::readme_rendering::columns::rendered_at, __diesel_infer_schema::infer_crates::crates::columns::name)>> : diesel::query_builder::Query`

Are you seeing any additional errors?

Nope. There's other code in the repo that shows versions joining to crates works fine, and versions joining to readme_rendering works fine.

Steps to reproduce

Clone https://github.com/carols10cents/diesel-inner-join-mvce and cargo run; you should get the errors shown above.

Checklist

  • [x] I have already looked over the issue tracker for similar issues.
bug documentation

Most helpful comment

Ha! Forget everything I said and only believe Bastien from now on.

Am 25.08.2017 um 18:06 schrieb Bastien Orivel notifications@github.com:

Hey, thanks for the awesome bug report with a repository and everything ❤️

You need to add a enable_multi_table_joins!(crates, readme_rendering); to your code as those are not inferred by diesel.


You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or mute the thread.

All 6 comments

Thanks for great issue! You don't see a repro repo every day :)

…and I'm make sure to actually look at that later (😅), but for now, what this reminds of is a recent change in diesel 0.16: The joinable! macro. By the way, did you upgrade diesel_codegen and friends to 0.16 as well?

So, my first try would be to add

joinable!(crates -> readme_rendering (crate_id));

or similar. Same for any other tables that have similar errors. If that works: Great! We probably missed a foreign key in the inference (I assume you specifically defined the foreign keys everywhere). This is a bug and we'll fix it.

Am 25.08.2017 um 17:51 schrieb Carol (Nichols || Goulding) notifications@github.com:

Setup

I have a repo demonstrating this problem here: https://github.com/carols10cents/diesel-inner-join-mvce

Versions

• Rust: stable 1.19.0
• Diesel: 0.16.0
• Database: postgres 9.6.1
• Operating System macOS Sierra
Feature Flags

• diesel: postgres
• diesel_codegen: postgres
Problem Description

What are you trying to accomplish?

I have these tables:

[derive(Debug, Clone, Queryable, Identifiable, Associations, AsChangeset)]

pub struct Crate {
pub id: i32,
pub name: String,
}

[derive(Clone, Identifiable, Queryable, Associations, Debug)]

[belongs_to(Crate)]

pub struct Version {
pub id: i32,
pub crate_id: i32,
}

[derive(Insertable, Identifiable, Queryable, Associations, Debug)]

[belongs_to(Version)]

[table_name = "readme_rendering"]

[primary_key(version_id)]

struct ReadmeRendering {
version_id: i32,
rendered_at: String,
}

And I would like to write diesel that generates the equivalent of:

SELECT * FROM versions
INNER JOIN readme_rendering ON versions.id = readme_rendering.version_id
INNER JOIN crates on versions.crate_id = crates.id;

This looks similar to the example with users, posts, and comments in the docs that says users.inner_join(posts).inner_join(comments) generates this sql:

SELECT * FROM users
INNER JOIN posts ON posts.user_id = users.id
INNER JOIN comments ON comments.user_id = users.id

So I have this query:

let versions_to_readme_and_crates_doesnt_work = versions::table
    .inner_join(readme_rendering::table)
    .inner_join(crates::table)
    .select((versions::all_columns, readme_rendering::rendered_at, crates::name))
    .load::<(Version, Option<String>, Option<String>)>(&conn)
    .expect("error loading versions_to_readme_and_crates_doesnt_work");

What is the expected output?

I expect this to compile and run the sql above.

What is the actual output?

I get this compilation error, which seems to indicate diesel is trying to join crates and readme_rendering?

error[E0277]: the trait bound __diesel_infer_schema::infer_readme_rendering::readme_rendering::table: diesel::JoinTo<__diesel_infer_schema::infer_crates::crates::table> is not satisfied
--> src/main.rs:62:10
|
62 | .inner_join(crates::table)
| ^^^^^^^^^^ the trait diesel::JoinTo<__diesel_infer_schema::infer_crates::crates::table> is not implemented for __diesel_infer_schema::infer_readme_rendering::readme_rendering::table

Full errors behind toggle:

Are you seeing any additional errors?

Nope. There's other code in the repo that shows versions joining to crates works fine, and versions joining to readme_rendering works fine.

Steps to reproduce

Clone https://github.com/carols10cents/diesel-inner-join-mvce and cargo run; you should get the errors shown above.

Checklist

• I have already looked over the issue tracker for similar issues.

You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub, or mute the thread.

Hey, thanks for the awesome bug report with a repository and everything ❤️

You need to add a enable_multi_table_joins!(crates, readme_rendering); to your code as those are not inferred by diesel.

Ha! Forget everything I said and only believe Bastien from now on.

Am 25.08.2017 um 18:06 schrieb Bastien Orivel notifications@github.com:

Hey, thanks for the awesome bug report with a repository and everything ❤️

You need to add a enable_multi_table_joins!(crates, readme_rendering); to your code as those are not inferred by diesel.


You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or mute the thread.

Hey, thanks for the awesome bug report with a repository and everything ❤️

You're welcome! I try :)

You need to add a enable_multi_table_joins!(crates, readme_rendering); to your code as those are not inferred by diesel.

I read the docs for that, but I didn't think that applied because i'm not trying to do crates.inner_join(readme_rendering) at all :-/ Why do I need that if I'm only trying to join each of those to version but not to each other?

The docs say:

// This would be required to do `users.inner_join(posts.inner_join(comments))`
// if there were an association between users and posts, and an association
// between posts and comments, but no association between users and comments

but that's not the join i'm trying to do, i'm trying to do the equivalent of users.inner_join(posts).inner_join(comments), which I thought was a different situation according to the inner_join docs....

Ok, I just tried it and the code compiles and runs the query i'm expecting... I think this is a documentation bug then :) The comment on the enable_multi_table_joins! macro made me think it didn't apply to my situation :-/

I have the same problme, when i do with inner_join

Was this page helpful?
0 / 5 - 0 ratings

Related issues

orionz picture orionz  ·  3Comments

qmx picture qmx  ·  3Comments

kollapsderwellenfunktion picture kollapsderwellenfunktion  ·  4Comments

ivan picture ivan  ·  4Comments

killercup picture killercup  ·  3Comments