Diesel:BoxableExpressions 在表及其连接上通用?

2023-12-10

我正在尝试在运行时构造一些过滤器,这些过滤器可以应用于表tunnel or to tunnel LEFT OUTER JOIN connection ON (tunnel.id = connection.tunnel_id).

这些表的定义如下:


// Define the tunnel table and struct
table! {
    #[allow(unused_imports)]
    use diesel::sql_types::*;
    tunnel (id) {
        id -> BigInt,
        name -> Text,
    }
}
#[derive(Queryable, Identifiable, Clone, Debug, PartialEq, Eq)]
#[table_name = "tunnel"]
pub struct Tunnel {
    pub id: i64,
    pub name: String,
}

// Define the connection table and struct
table! {
    #[allow(unused_imports)]
    use diesel::sql_types::*;
    connection(id) {
        id -> BigInt,
        tunnel_id -> BigInt,
    }
}

#[derive(Debug, Associations, Identifiable, Queryable)]
#[table_name = "connection"]
#[primary_key(id)]
#[belongs_to(Tunnel)]
pub struct Connection {
    pub id: i64,
    pub tunnel_id: i64,
}

joinable!(connection -> tunnel(tunnel_id));
allow_tables_to_appear_in_same_query!(connection, tunnel);

我可以编写一个为单个表构造动态的函数:

fn filters_t(
    name: &'static str,
) -> Vec<Box<dyn BoxableExpression<tunnel::table, Pg, SqlType = Bool>>> {
    let mut wheres: Vec<Box<dyn BoxableExpression<tunnel::table, Pg, SqlType = Bool>>> = Vec::new();
    wheres.push(Box::new(tunnel::name.eq(name)));
    wheres
}

或者对于加入:

pub type TunnelJoinConnection = JoinOn<
    Join<tunnel::table, connection::table, LeftOuter>,
    Eq<Nullable<connection::columns::tunnel_id>, Nullable<tunnel::columns::id>>,
>;

fn filters_j(
    name: &'static str,
) -> Vec<Box<dyn BoxableExpression<TunnelJoinConnection, Pg, SqlType = Bool>>> {
    let mut wheres: Vec<Box<dyn BoxableExpression<TunnelJoinConnection, Pg, SqlType = Bool>>> =
        Vec::new();
    wheres.push(Box::new(tunnel::name.eq(name)));
    wheres
}

请注意,这两个过滤器函数具有完全相同的函数体,因此我应该能够创建一个实现这两个过滤器函数的通用函数。但是当我尝试使其通用时出现错误。

fn filters<T>(name: &'static str) -> Vec<Box<dyn BoxableExpression<T, Pg, SqlType = Bool>>>
where
    T: AppearsInFromClause<tunnel::table, Count = Once>,
{
    vec![Box::new(tunnel::name.eq(name))]
}

错误是

   |
85 |     vec![Box::new(tunnel::name.eq(name))]
   |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `diesel::SelectableExpression<T>` is not implemented for `tunnel::columns::name`
   |
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<T>` for `diesel::expression::operators::Eq<tunnel::columns::name, diesel::expression::bound::Bound<diesel::sql_types::Text, &str>>`
   = note: required because of the requirements on the impl of `diesel::BoxableExpression<T, diesel::pg::Pg>` for `diesel::expression::operators::Eq<tunnel::columns::name, diesel::expression::bound::Bound<diesel::sql_types::Text, &str>>`
   = note: required for the cast to the object type `dyn diesel::BoxableExpression<T, diesel::pg::Pg, SqlType = diesel::sql_types::Bool>`

最小的例子here,您可以克隆该最小示例并运行cargo check自己查看错误。


这个问题可以通过一个小改动来解决:

fn filters<T>(name: &'static str) -> Vec<Box<dyn BoxableExpression<T, Pg, SqlType = Bool>>>
where
    diesel::dsl::Eq<tunnel::name, &'static str>: BoxableExpression<T, Pg, SqlType = Bool>,
{
    vec![Box::new(tunnel::name.eq(name))]
}

基本上,您需要在编译时断言您的盒装表达式确实实现了BoxableExpression<T, Pg, SqlType = Bool>为了所有可能的T的。如果只有一个特定的T由 rustc 检查,对于一般情况,需要显式写出。这diesel::dsl::Eq辅助类型是返回类型的类型级构造函数tunnel::name.eq(name)。这意味着您添加到列表中的每个表达式都需要一个类似的子句。

另一个不相关的注释:

pub type TunnelJoinConnection = JoinOn<
    Join<tunnel::table, connection::table, LeftOuter>,
    Eq<Nullable<connection::columns::tunnel_id>, Nullable<tunnel::columns::id>>,
>;

使用不被视为柴油公共 API 一部分的类型。这意味着这样的表达式可能会随着任何更新而中断。使用公共 API 编写此类型的正确方法是

pub type TunnelJoinConnection = diesel::dsl::LeftJoin<tunnel::table, connection::table>;`
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Diesel:BoxableExpressions 在表及其连接上通用? 的相关文章

随机推荐

  • 类型错误参数过多

    运行此代码时 出现错误 第 8 行参数过多 我不确定如何修复它 Defining a function to raise the first to the power of the second def power value x y re
  • Mongodb 错误:子进程失败,退出,错误号 51

    mongodb 由于某种原因关闭了 系统异常关闭 当我尝试重新启动 mongodb 使用 mongod f usr local mongodb etc mongo conf got about to fork child process w
  • Java 游戏 - ClassCastException

    我正在开发一个简单的 java 游戏 我的滚动条引发异常 滚动条应该是一个 gameslider 线程 Thread 3 中的异常 java lang ClassCastException sun java2d NullSurfaceDat
  • 自动布局 iOS 11 工具栏 UIBarButtonItem 与 customView

    最近 在我们的项目中 使用自定义视图的 UIBarButtonItem 出现了问题 在 iOS 11 之前 我们通过灵活的间距项进行布局 这不再起作用 所以什么也没有显示 因为我在这里没有找到真正为我解决问题的答案 所以我研究了它并提出了一
  • 在 cmake 中命名可执行文件

    我正在开发一个项目并决定将其移植到 CMake 在配置时 我使用了占位符构建名称 build 没有遇到任何问题 但当我把名字改成S W CMake 不让我构建 它产生了错误消息 cmake CMake Error at CMakeLists
  • 如何使用 System.Net.ConnectStream?

    我正在尝试了解我前辈的一些代码 他们使用 var 来声明所有内容 这很有帮助 我有一个使用声明如下 using var postStream request GetRequestStream postStream Write byteDat
  • 了解 ImageMagick 的转换并转换为 Ruby RMagick

    我未能将以下 PHP ImageMagick 代码转换为 Ruby RMagick 以使未来的用户更易于管理并了解它真正在做什么 output array returnValue 0 pngFiles myDir gt find png i
  • 启用 Docker 远程 API - raspberry pi / raspbian

    我的出发点是 如何使用docker Remote api创建容器 所以我编辑 etc init docker conf并更新 2 次出现的DOCKER OPTS变量为 DOCKER OPTS H tcp 0 0 0 0 4243 H uni
  • “无法设置 Range 类的 Width 属性”

    我正在致力于自动化构建成本估算表 基于假设 规则 政策等 一切顺利 直到我想自动设置列宽 这里有一个简短的蒸馏 Dim NumCE As Integer Dim TotalWidth As Integer NumCE 1 Sheets Co
  • jqGrid 删除一行

    我已经创建了网格 并想使用网格的默认行为来删除一行 这是我的网格设置代码 grid jqGrid navGrid grid pager add true addtitle Add Customer edit true edittitle E
  • isReleaseBuild() 是 Android Gradle DSL 的一部分吗?

    我按照类似于以下的说明进行操作 Android Library Gradle 发布 JAR 但是 我收到以下错误 在项目 myProject 上找不到参数 的 isReleaseBuild 方法 我在 Maven 集成中看到的示例都没有定义
  • Pandas 数据帧太大而无法附加到 dask 数据帧?

    我不确定我在这里缺少什么 我认为 dask 可以解决我的内存问题 我有 100 多个以 pickle 格式保存的 pandas 数据帧 我希望将它们全部放在同一个数据框中 但不断遇到内存问题 我已经增加了 jupyter 中的内存缓冲区 看
  • Firefox 浏览器无法识别 table.cells 吗?

    我有以下 JavaScript 代码 var myCellCollection document getElementById myTbl cells 这在 IE 中效果很好 它返回表格单元格的集合 但同一行在 Firefox 中返回 未定
  • 在不使用配置规范的情况下从 Clearcase 复制具有特定标签的元素

    如何从中复制元素或文件Clearcase具有特定的label 不应用该label in config specs 我不想更改视图的配置规范 但我需要访问所选文件之一的旧版本 并且我想直接从现有视图执行此操作 同样 不更改任何内容 我知道我想
  • iOS 13 文本转语音(TTS - AVSpeechSynthesisVoice)更新后某些用户崩溃

    更新到 iOS 13 后 我们发现一小部分用户因 TTS 问题而出现奇怪的崩溃 有人知道为什么会发生这种情况吗 有人看到同样的崩溃吗 let voices AVSpeechSynthesisVoice speechVoices for vo
  • 使用空手道框架执行 API 测试时观察到 DNS 错误 [重复]

    这个问题在这里已经有答案了 在通过 karat 对 api 执行 get 调用时 当我使用的代理被注释时观察到 DNS 错误 但如果我使用代理 它会返回 401 错误 下面是以下代码 特征文件代码 Background url baseUr
  • 使用 Dask 导入大型 CSV 文件

    我正在使用 Dask 导入一个非常大的 csv 文件 680GB 但是 输出不是我所期望的 我的目标是仅选择一些列 6 50 并可能过滤它们 我不确定 因为似乎没有数据 import dask dataframe as dd file pa
  • SQL 截断、删除、删除建议

    我在 SQL 数据库中有一个表 想要从中删除数据 不过我想保留这些列 例如我的表有 3 列 姓名 年龄 日期 我不想删除这些 我只想删除数据 我应该截断 删除还是删除 不要删除 它会删除数据和定义 如果删除 数据就会消失 并且自动增量值将从
  • 如何将文本放置在边框上?

    我能够让它在白色背景下工作 但在背景不是白色的情况下 该解决方案也不起作用 我做了什么应该很明显为什么它不起作用 负边距 背景设置为背景颜色 有什么解决方案可以使它始终看起来不错吗 一种方法是使用间隔跨度和包装器 在本例中header 所有
  • Diesel:BoxableExpressions 在表及其连接上通用?

    我正在尝试在运行时构造一些过滤器 这些过滤器可以应用于表tunnel or to tunnel LEFT OUTER JOIN connection ON tunnel id connection tunnel id 这些表的定义如下 De