首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用eq_any的子查询不编译

使用eq_any的子查询不编译
EN

Stack Overflow用户
提问于 2020-08-16 18:44:46
回答 1查看 473关注 0票数 2

我的模型的相关部分:

代码语言:javascript
运行
复制
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查询:

代码语言:javascript
运行
复制
select * from server_website where server_database_id in (
    select id from server_database where server_id = 83
);

这是我的柴油查询代码:

代码语言:javascript
运行
复制
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();

这与错误失败:

代码语言:javascript
运行
复制
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<Nullable<Integer>>类型,这在我看来很好(除了可空)。

内部查询或多或少具有SelectStatement<server_database, SelectClause<server_database::id>>类型,我认为这个类型很好,因为id是Integer,就像外部查询想要的那样。

我有一种感觉,我很接近,但我不能指手画脚。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-17 16:16:28

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

代码语言:javascript
运行
复制
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 @weiznich on the 柴油Gitter通道回答了这个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63440741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档