Удаление запроса со сложным фильтром с использованием Kotlin Exposed

#postgresql #kotlin #kotlin-exposed

#postgresql #котлин #kotlin-exposed

Вопрос:

Я создаю запрос на удаление, в котором мне нужно вызвать собственные функции 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

Комментарии:

1. Обратите внимание, что where t.created_at < current_date - 120 это был бы более эффективный запрос, поскольку он мог бы использовать индекс на created_at

2. Расширяя предложение @a_horse_with_no_name, было бы тривиально реализовать его в kotlin, если предварительно выполнить вычисления current_date - 120days в kotlin заранее. В любом случае, кажется, что при чтении этой проблемы базовая математика должна быть возможной

3. @JensV: разве вы не можете просто параметризовать запрос, используя, например delete from my_table where created_at < current_date - ? ,, а затем передать целочисленное значение? По крайней мере, так это будет работать в JDBC

4. @a_horse_with_no_name Абсолютно, я не использую exposed и не знаю, есть ли у них способ выражения current_date запроса

5. @a_horse_with_no_name Вам понадобится какой-то способ добавить его в запрос. Мне просто было интересно, как вы это сделаете, но я нашел это здесь: github.com/JetBrains/Exposed/blob /… Однако документация проекта, по-видимому, сильно отсутствует

Ответ №1:

окончательное решение было следующим:

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

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