Неявное обновление некоторых полей при обновлении в Slick? - PullRequest
1 голос
/ 01 июня 2019

Я использую Slick 3.2 в своем приложении Scala.

В моем приложении все таблицы имеют created_at и updated_at в качестве полей. Например, таблица users имеет created_at и updated_at.

Я хочу обновить updated_at неявно, когда я обновляю эти таблицы через Slick, реализуя метод расширения.

Есть ли способ реализовать такой метод?

package com.example

object Main {
  import slick.jdbc.MySQLProfile.api._
  import java.time.Instant
  import slick.jdbc.JdbcType
  import java.sql.Timestamp

  implicit val instantColumnType: JdbcType[Instant] with BaseTypedType[Instant] = ??? // definition is omitted.

  case class User(id: Int, name: String, mail: String, createdAt: Instant, updatedAt: Instant)

  abstract class AppTable[T](tag: Tag, tableName: String) extends Table[T](tag, tableName) {
    def createdAt = column[Instant]("created_at")
    def updatedAt = column[Instant]("updated_at")
  }

  class UserTable(tag: Tag) extends AppTable[User](tag, "users") {
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
    def name = column[String]("name")
    def mail = column[String]("mail")

    def * = (id, name, mail, createdAt, updatedAt) <> ((User.apply _).tupled, User.unapply)
  }

  val users: TableQuery[UserTable] = ??? // instantiation of users is omitted.

  def main(args: Array[String]): Unit = {
    // This needs to execute SQL like
    // UPDATE users SET name = 'foo', mail = 'bar@example.com', updated_at = '2019-06-02T02:27:43'
    users
      .filter(record => record.id === 42)
      .updateExtra(
        record => (record.name, record.mail),
        ("foo", "bar@example.com"),
      )
  }
}

1 Ответ

0 голосов
/ 03 июня 2019

Возможно, это не то решение, которое вы ищете, но я бы перенес эту функцию в базу данных с помощью триггера.Вероятно, возможно определить в Slick, но, скорее всего, еще проще просто использовать SQL.как то так

create trigger before update on users 
for each row
set NEW.updated_at = UTC_TIMESTAMP
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...