Допустим, у меня есть модель, которая выглядит примерно так:
case class User(username: String, dateOfBirth: Timestamp, lastSentGift: Timestamp)
Если у меня есть соответствующая сопровождающая схема Slick, Users
, как я могу выполнить несколько запросов к этой таблице в транзакции с функцией scala, которая вызывается между ними?
Я видел, что Slick предоставляет DBIOAction
и DBIO.seq
, чтобы разрешить составление нескольких операций с базой данных в одной транзакции, но я не понимаю, могу ли я использовать их с функцией scala, вызываемой между .
Например, я хотел бы сделать что-то подобное, но сохранить все в одной транзакции:
def prepareGiftFor(user: User): Timestamp = ???
val usersWithBirthdays = db.run(
Users.filter { user =>
user.dateOfBirth > (now - 1 month) && user.lastSentGift < (now - 1 month)
}
.limit(100)
.forUpdate
)
usersWithBirthdays
.map(user => (user.username, prepareGiftFor(user)))
.map { case (username, lastSentGift) =>
db.run(
Users.withFilter(_.username === username)
.map(row => row.lastSentGift)
.update(lastSentGift)
)
}