【问题标题】:subquery with eq_any doesn't compile带有 eq_any 的子查询无法编译
【发布时间】:2020-12-05 23:49:47
【问题描述】:

我的模型的相关部分:

table! {
    server_website {
        id -> Integer,
        server_database_id -> Nullable<Integer>,
        server_id -> Integer,
    }
}

table! {
    server_database {
        id -> Integer,
        server_id -> Integer,
    }
}

table! {
    server {
        id -> Integer,
    }
}

joinable!(server_website -> server_database (server_database_id));
allow_tables_to_appear_in_same_query!(server_website, server_database);

#[derive(Queryable, Debug, Clone, PartialEq, Eq)]
pub struct Server {
    pub id: i32,
}

#[derive(Queryable, Debug, Clone, PartialEq, Eq)]
pub struct ServerWebsite {
    pub id: i32,
    pub server_database_id: Option<i32>,
    pub server_id: i32,
}

#[derive(Queryable, Debug, Clone, PartialEq, Eq)]
pub struct ServerDatabase {
    pub id: i32,
    pub server_id: i32,
}

我正在尝试用 Diesel 表达以下有效的 SQLite 查询:

select * from server_website where server_database_id in (
    select id from server_database where server_id = 83
);

这是我的柴油查询代码:

use projectpadsql::schema::server::dsl as srv;
use projectpadsql::schema::server_database::dsl as db;
use projectpadsql::schema::server_website::dsl as srvw;

let database_ids_from_server = db::server_database
    .filter(db::server_id.eq(83))
    .select(db::id);
let used_websites = srvw::server_website
    .filter(srvw::server_database_id.eq_any(database_ids_from_server))
    .load::<ServerWebsite>(sql_conn)
    .unwrap();

这失败并出现错误:

error[E0277]: the trait bound `diesel::query_builder::SelectStatement<projectpadsql::schema::server_database::table, diesel::query_builder::select_clause::SelectClause<projectpadsql::schema::server_database::columns::id>, diesel::query_builder::distinct_clause::NoDistinctClause, diesel::query_builder::where_clause::WhereClause<diesel::expression::operators::Eq<projectpadsql::schema::server_database::columns::server_id, diesel::expression::bound::Bound<diesel::sql_types::Integer, i32>>>>: diesel::expression::array_comparison::AsInExpression<diesel::sql_types::Nullable<diesel::sql_types::Integer>>` is not satisfied

我看到编译器希望内部查询具有 AsInExpression&lt;Nullable&lt;Integer&gt;&gt; 类型,这对我来说看起来不错(除了可为空的)。

内部查询或多或少具有SelectStatement&lt;server_database, SelectClause&lt;server_database::id&gt;&gt; 类型,这对我来说看起来不错,因为id 是Integer,就像外部查询想要的那样。

我感觉我已经很接近了,但我无法确定问题所在。

【问题讨论】:

    标签: rust rust-diesel


    【解决方案1】:

    我需要使用nullable() 来获得匹配的类型。注意db::id.nullable()

    let database_ids_from_server = db::server_database
        .filter(db::server_id.eq(server_id))
        .select(db::id.nullable());
    let used_websites = srvw::server_website
        .filter(srvw::server_database_id.eq_any(database_ids_from_server))
        .load::<ServerWebsite>(sql_conn)
        .unwrap();
    

    Georg Semmler - @weiznich 在Diesel Gitter channel 上回答了这个问题。

    【讨论】:

      猜你喜欢
      • 2014-05-16
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多