【问题标题】:Delete query with complex filter using Kotlin Exposed使用 Kotlin Exposed 删除带有复杂过滤器的查询
【发布时间】:2021-01-07 19:17:27
【问题描述】:

我正在创建一个删除查询,我需要在其中调用本机 Postgres 函数来过滤应删除的记录。

总而言之,查询如下:删除所有 start_at 列(时间戳)超过 5 天的记录(查询的动态参数)

对于原生 SQL,查询如下:

delete from my_table t where date_part ('day', (current_date - t.start_at))> = 5

在我的 Kotlin 编码中,我无法实现此查询。公开文档中的示例没有具有更复杂过滤器的代码。我知道是这样的:

(1)

transaction {
   MyTable.deleteWhere {
     MyTable.startAt greaterEq ??????
   }
}

(2)

transaction {
   exec ("delete query here> = $ {daysToFilter}")
}

有没有办法在示例 (1) 之后的代码中执行此查询? 如果不是,那么执行此查询的最佳方法是什么?

示例数据集:

id start_at
1 2020-09-01 09:00:00
2 2020-09-02 09:00:00
3 2020-09-03 09:00:00
4 2020-09-04 09:00:00

【问题讨论】:

  • 请注意,where t.created_at < current_date - 120 将是一个更有效的查询,因为它可以利用 created_at 上的索引
  • 扩展 @a_horse_with_no_name 建议,如果您预先在 kotlin 中预先计算 current_date - 120days,那么在 kotlin 中实现将变得微不足道。无论哪种方式,从阅读 this issue 看来,基本数学应该是可能的
  • @JensV:你不能只使用例如参数化查询吗? delete from my_table where created_at < current_date - ?然后传递一个整数值?至少在 JDBC 中是这样的
  • @a_horse_with_no_name 当然,我不使用暴露的,但不知道他们是否有办法表达current_date 用于查询
  • @a_horse_with_no_name 您需要某种方式将其添加到查询中。我只是想知道你是怎么做到的,但我在这里找到了它:github.com/JetBrains/Exposed/blob/… 该项目的文档似乎严重缺乏

标签: postgresql kotlin kotlin-exposed


【解决方案1】:

最终的解决方案如下:

fun my_function(days: Int) {
    val startAt = DateTime.now()
                .withTimeAtStartOfDay()
                .minusDays(days)

    transaction {
        MyTable.deleteWhere {
            MyTable.startAt greaterEq startAt         
        }     
    } 
}

【讨论】:

    猜你喜欢
    • 2018-05-18
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2016-04-12
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    相关资源
    最近更新 更多