#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 - ?
,, а затем передать целочисленное значение? По крайней мере, так это будет работать в JDBC4. @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
}
}
}