Slick: Как отфильтровать по атрибуту базы данных isBefore Timestamp? - PullRequest
1 голос
/ 26 мая 2019

Я наивно сделал следующее на Slick 4.0.1.У меня есть поле базы данных с истекшим сроком действия, и мне нужно найти все строки, в которых истек срок действия до заданной отметки времени.

Вот как выглядит Slick-отображение:

/** Table description of table auth_token. Objects of this class serve as prototypes for rows in queries. */
class AuthToken(_tableTag: Tag) extends profile.api.Table[AuthTokenRow](_tableTag, Some("myappdb"), "auth_token") with IdentifyableTable[Long] {
  override def id = userId

  def * = (userId, tokenId, expiry) <> (AuthTokenRow.tupled, AuthTokenRow.unapply)
  /** Maps whole row to an option. Useful for outer joins. */
  def ? = ((Rep.Some(userId), Rep.Some(tokenId), Rep.Some(expiry))).shaped.<>({ r => import r._; _1.map(_ => AuthTokenRow.tupled((_1.get, _2.get, _3.get))) }, (_: Any) => throw new Exception("Inserting into ? projection not supported."))

  /** Database column user_id SqlType(BIGINT UNSIGNED) */
  val userId: Rep[Long] = column[Long]("user_id")
  /** Database column token_id SqlType(CHAR), Length(36,false) */
  val tokenId: Rep[String] = column[String]("token_id", O.Length(36, varying = false))
  /** Database column expiry SqlType(TIMESTAMP) */
  val expiry: Rep[java.sql.Timestamp] = column[java.sql.Timestamp]("expiry")

  /** Foreign key referencing User (database name auth_token_ibfk_1) */
  lazy val userFk = foreignKey("auth_token_ibfk_1", userId, User)(r => r.id, onUpdate = ForeignKeyAction.NoAction, onDelete = ForeignKeyAction.Cascade)

  /** Index over (tokenId) (database name idx_token_id) */
  val index1 = index("idx_token_id", tokenId)
}
/** Collection-like TableQuery object for table AuthToken */
lazy val AuthToken = new TableQuery(tag => new AuthToken(tag))

, а затем янужно сделать:

/**
 * Finds expired tokens.
 *
 * @param dateTime The current date time.
 */
def findExpired(dateTime: org.joda.time.DateTime): Future[Seq[AuthTokenRow]] = {
  val action = AuthToken.filter(authToken => authToken.expiry.isBefore(dateTime)).result
  db.run(action)
}

Как правильно / официально покрыть этот вариант использования в Slick?

1 Ответ

1 голос
/ 27 мая 2019

Я решил эту проблему путем повторного использования проекта slick-joda-mapper .Это решение немного сложное из-за работы с генератором Slick и т. Д., Но оно ОЧЕНЬ чисто, мне это нравится.В основном это позволяет отображать типы даты и времени базы данных на типы Joda, такие как org.joda.time.DateTime.Поэтому мое решение становится таким же простым, как использование операторов сравнения, поддерживаемых Joda DateTime:

/**
 * Finds expired tokens.
 *
 * @param dateTime The current date time.
 */
override def findExpired(dateTime: org.joda.time.DateTime): Future[Seq[AuthTokenRow]] = {
  val action = AuthToken.filter(authToken => authToken.expiry < dateTime).result
  db.run(action)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...