如何在 Diesel 中针对 Postgres 数据库执行带有子查询的删除?

2024-01-01

我在 Postgres 数据库中有以下架构:

Table A {
  ID
  Name
}

Table B {
  ID FOREIGN KEY (A.ID)
}

我正在尝试在 Diesel 中编写以下查询:

DELETE FROM B
WHERE B.ID in (SELECT ID from A WHERE A.Name = $VAR)

$VAR是我的应用程序传递的变量。

我第一次尝试写这篇文章如下:

fn deleteB(conn: &PgConnection, n: &str) {
    use schema::A::dsl::*;
    use schema::A;
    use schema::B;

    let res = A::table
        .filter(Name.eq(n))
        .select(ID);
        .load(conn)
        .unwrap();
    assert!(res.len() < 2);
    let b_id: i32 = *res.iter().nth(1).unwrap_or(&0);

    let _rows = diesel::delete(
        B::table
        .filter(ID.eq(n_id))
    )
    .execute(conn)
    .unwrap();
}

这可以编译但不起作用:SELECTID 的语句始终返回 0。它与 A 中插入的任何记录都不匹配,即使我手动检查它们是否存在。我确信我的比赛进行方式有误(&str vs &String也许?),但我决定尝试一种不同的解决方案,因为我无论如何都不喜欢这个解决方案,因为它必须对数据库执行两个单独的语句。

我的第二次尝试如下所示:

fn deleteB(conn: &PgConnection, n: &str) {
    use schema::A::dsl::*;
    use schema::A;
    use schema::B;

    let source = B::table.inner_join(A::table)
            .filter(Name.eq(n));
    let s = delete(source)
            .execute(conn)
            .unwrap();
}

这对我来说看起来更符合 Diesel 习惯(剧透警告,我几乎不知道框架),但果然,它无法编译:

    |
410 |     let s = delete(source)
    |                    ^^^^^^ the trait `diesel::query_builder::IntoUpdateTarget` is not implemented for `diesel::query_builder::SelectStatement<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<mobility2::schema::B::table...` (very long error)

当我意识到这似乎是一个微不足道的操作(删除本身)时,我正在研究上述特征,并且我可能最好寻求帮助。

如何正确编写惯用的 Diesel 代码来执行我想要执行的删除语句?


由于 Diesel 语句完全映射到 SQL,因此您编写的查询将导致:

DELETE FROM TABLE B INNER JOIN TABLE A ON … WHERE name = $1

这不是有效的 SQL,因此会导致编译时错误。

要获取您想要编写的查询,您需要执行以下操作:

#[macro_use]
extern crate diesel;

use diesel::delete;
use diesel::prelude::*;

mod schema {
    table! {
        A(ID) {
            ID -> Integer,
            name -> Text,
        }
    }

    table! {
        B(ID) {
            ID -> Integer,
        }
    }

    allow_tables_to_appear_in_same_query!(A, B);
}

fn deleteB(conn: &PgConnection, n: &str) {
    use schema::A;
    use schema::B;

    let s = delete(B::table)
        .filter(B::ID.eq_any(A::table.filter(A::name.eq(n)).select(A::ID)))
        .execute(conn)
        .unwrap();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Diesel 中针对 Postgres 数据库执行带有子查询的删除? 的相关文章

随机推荐

  • 遮罩图像,从多个渐变创建矩形

    我有一个径向渐变用作mask image将图像 淡入 background color behind图片 mask image radial gradient ellipse at center rgba 255 255 255 1 1 r
  • 如何使用 javascript 创建 xhtml 元素

    如何使用 javascript 动态创建 html 元素 我想在表格单元格内添加一个复选框 所以我希望代码看起来像这样 td td
  • 将 GraphQL 数据拉入 gatsby-browser.js (或更好的解决方案,请)

    我正在尝试运行一个GraphQL里面查询replaceRouterComponent从内部gatsby browser js 盖茨比浏览器API https www gatsbyjs org docs browser apis 然而 我可以
  • 什么是特殊目的寄存器? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 什么是特殊用途寄存器 特殊用途寄存器的名称是什么 以及每个寄存器的一些描述 顾名思义 特殊用途寄存器是专为任务而设计的寄存器 例如 c
  • Dart 支持参数化单元测试吗?

    我想运行一个 Dart 测试 该测试使用一组输入和预期输出重复进行 类似于 JUnit 的情况 我编写了以下测试来实现类似的行为 但问题是 如果所有测试输出计算不正确 则测试只会失败一次 import package test test d
  • Flask 应用程序使用 opencv 运行速度非常慢

    我有一个烧瓶应用程序 它从相机读取帧并将其传输到网站 相机 py from threading import Thread from copy import deepcopy import queue import cv2 class Ca
  • 为什么我不能用 std::unordered_map 替换 std::map

    这个问题可能有点粗略 因为我家里没有可用的代码 但我知道这件事否则会困扰我整个周末 当我尝试将一些代码更新到 C 11 时 我开始替换一些代码std map with std unordered map 该代码仅使用std map find
  • CGRectContainsRect 不工作

    我用这个方法有问题 我有两个显然彼此包含的矩形 我什至手动绘制了它们的坐标以确保 当我使用 CGRectContainsRect 比较这两个矩形时 它返回 false 对于我的一生 我已经尝试了一切 搜索了网络 但我找不到这个问题的答案 有
  • 使用 jQuery 从 HTML 文本查询脚本元素

    我正在通过以下方式加载页面 ajax 并插入parts将结果放入页面的相应部分 ajax url whole page html success function data status xhr result xhr responseTex
  • Jenkins:将用户定义的变量传递给 Email-Ext 插件

    我使用 Email Ext 插件在声明性管道的构建后阶段的构建结束时发送结果电子邮件 在电子邮件正文中 我尝试插入一些环境变量和一些用户定义的环境变量 内置变量显示正常 但是我定义的任何用户定义变量在电子邮件正文中都是空的 或者在 Atta
  • Visual Studio 2017 中的 React 项目

    我想在 Visual Studio 2017 中与我的 NET 应用程序一起开发 React 应用程序 在同一解决方案中 我正在使用 TypeScript 所以我想要一个可以自定义构建的项目类型 我想对项目进行 webpack 等 所以标准
  • Swing 组件不显示泰文字符

    我有一个简单的摆动应用程序 当我将泰语文本设置为 JLabel 或其他组件时 它们显示像问号的字符而不是泰语文本 有什么办法可以在 Swing 应用程序中支持泰语吗 没有特殊的功能或配置要做 确保您的字体支持泰语字符 当我遇到同样的问题时
  • 如何在 BaseColumns 中使用 _COUNT

    我一直在读BaseColumns https developer android com reference android provider BaseColumns html https developer android com ref
  • 在辅助屏幕上显示 NSWindow

    我想显示一个NSWindow在辅助监视器上全屏显示情节提要中创建的 以下代码导致窗口显示在主屏幕 主屏幕上 Y 原点没问题 但 X 原点是 0 它应该是 1680 下面的代码在优胜美地之前有效 NSScreen screen NSScree
  • RxAndroid 3主线程

    我正在尝试在 Rx3 中找到 subscribeOn 的主线程 Single just getHeavyData subscribeOn Schedulers io observeOn AndroidSchedulers mainThrea
  • 使用网络服务发现在 Java 服务器和 Android 客户端之间进行通信

    我正在构建一个 Java 服务器应用程序 在 PC 上运行 它使用以下命令将自身注册到本地网络JmDNS http jmdns sourceforge net 以及一个 Android 客户端应用程序 该应用程序应该使用以下命令发现 jav
  • 如何使用任务有条件地异步运行代码

    我有一个负责检索资源的类 该类还缓存它们以便快速访问 该类公开了用于检索资源的异步方法 public Task GetResourceAsync string resourceName return Task Factory StartNe
  • 标头部分中的 ransack 搜索表单:未向 search_form_for 提供 Ransack::Search 对象

    首先 我是 RoR 新手 所以答案可能是显而易见的 在这种情况下我深表歉意 我环顾四周 没有发现任何有帮助的东西 我试图在我的应用程序的每个网页的标题上都有一个搜索表单 它将搜索我所有 存储桶 的名称 这是相关代码 在 app views
  • Rails 身份验证令牌和 Ajax

    好吧 根据我在其他网站和堆栈溢出上读到的内容 Rails 会抛出此身份验证令牌错误 因为我的表单未传递令牌 这是一项安全功能 这我明白了 但我确实没有表格 我这里有 ajax 我的 javascript 将 id ed 信息发布到处理函数中
  • 如何在 Diesel 中针对 Postgres 数据库执行带有子查询的删除?

    我在 Postgres 数据库中有以下架构 Table A ID Name Table B ID FOREIGN KEY A ID 我正在尝试在 Diesel 中编写以下查询 DELETE FROM B WHERE B ID in SELE