Scala Slick: Cusom mapper типа DateTime to datetime - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь сохранить свои объекты DateTime, такие как типы DATETIME, в базе данных. До сих пор я не мог видеть ни одного подобного примера, и вместо этого я видел несколько дел, начиная от DateTime до Timestamp или DATE в базе данных.

Кто-то сталкивался с такой же проблемой?

Мой код (сейчас не работает) выглядит следующим образом:

import slick.jdbc.MySQLProfile.api._
import com.github.nscala_time.time.Imports.DateTime

object CustomMappers {
   implicit def dateTimeMapper = MappedColumnType.base[DateTime, DateTime](
        tmap = { dateTimeObject => new DateTime(dateTimeObject.getMillis)},
        tcomap = { dateTimeDb => new DateTime(dateTimeDb) }
  )
}

1 Ответ

1 голос
/ 20 марта 2019

Чтобы получить полный контроль над тем, как хранятся эти данные, вы можете:

  1. Указать тип столбца базы данных при его определении.Slick автоматически делает разумный выбор, но вы можете использовать опцию столбца O.SqlType, чтобы переопределить его типом (возможно, зависящим от поставщика).
  2. Затем предоставьте настраиваемое отображение из вашего типа в значение, которое делаетсмысл для типа столбца базы данных, который вы хотите использовать.

Первая часть в определении вашей таблицы:

class MyTable(tag: Tag) extends Table[MyClass](tag, "table_name") {
   def when = column[MyDateTime]("my_date", O.SqlType("DATETIME")
   // another example:
   def avatar = column[Option[Array[Byte]]]("avatar", O.SqlType("BINARY(2048)"))
}

Если вы используете Slick для создания схемы, столбцу my_date будет присвоен тип DATETIME,

Во второй части вы предоставляете сопоставление, подобное тому, которое задано в вашем вопросе.Это должен быть тип данных, который вы хотите использовать (DateTime), или тип данных, который имеет смысл для столбца DATETIME.Например, документация MySQL указывает, что формат: YYYY-MM-DD HH:MM:SS.Так что ваша картографическая функция должна иметь возможность принимать и создавать String типов этого формата.

В качестве альтернативы ...

Начиная с Slick 3.3.0, есть встроенныхв поддержку типов данных java.time.В Java нет DateTime, но, возможно, Java LocalDateTime или ZonedDateTime может удовлетворить ваши потребности.В этом случае нет необходимости в отображении или O.SqlType.

...