Scala Slick:Cusom 映射器类型 DateTime 到日期时间
Scala Slick: Cusom mapper type DateTime to datetime
我正在尝试将我的 DateTime 对象(如 DATETIME 类型)存储到 database.So 中,到目前为止我看不到任何这样的示例,而是我在数据库中看到了一些从 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) }
)
}
要完全控制此数据的存储方式,您可以:
- 定义列时指定数据库列类型。 Slick 会自动在此处做出明智的选择,但您可以使用
O.SqlType
的列选项用(可能是特定于供应商的)类型覆盖它。
- 然后提供从您的类型到对您要使用的数据库列类型有意义的值的自定义映射。
第一部分在您的 table 定义中:
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
。
对于第二部分,您提供了一个类似于您问题中的映射。它应该是 to/from 您要使用的数据类型 (DateTime) 到对 DATETIME
列有意义的类型。例如,MySQL 文档指示格式为:YYYY-MM-DD HH:MM:SS
。那么您的映射函数应该能够接受和生成该格式的 String
类型。
作为替代方案...
从 Slick 3.3.0 开始,有 built-in support for the java.time
数据类型。 Java 中没有 DateTime
,但 Java LocalDateTime
或 ZonedDateTime
可能会满足您的需要。在这种情况下,不需要映射或 O.SqlType
.
对于 slick 3.3.0,我找到了另一个解决方法。 (它应该也适用于其他版本)
def cusDateTimeCol = column[LocalDateTime]("cusDateTimeCol", O.SqlType("datetime"))(localDateTimeMapper)
范围如下。 (使用特征并将其导入 table 定义)
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
implicit def LocalDateTimeToStr(d: LocalDateTime): String = {
d.format(formatter)
}
implicit def strToLocalDateTime(s: String): LocalDateTime = {
LocalDateTime.parse(s, formatter)
}
implicit val localDateTimeMapper = MappedColumnType.base[LocalDateTime, String](
LocalDateTimeToStr(_),
strToLocalDateTime(_)
)
使用此设置,代码将 read/write 日期时间格式 YYYY-mm-dd HH:mm:ss
而不是通常的 ISO 格式。
我正在尝试将我的 DateTime 对象(如 DATETIME 类型)存储到 database.So 中,到目前为止我看不到任何这样的示例,而是我在数据库中看到了一些从 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) }
)
}
要完全控制此数据的存储方式,您可以:
- 定义列时指定数据库列类型。 Slick 会自动在此处做出明智的选择,但您可以使用
O.SqlType
的列选项用(可能是特定于供应商的)类型覆盖它。 - 然后提供从您的类型到对您要使用的数据库列类型有意义的值的自定义映射。
第一部分在您的 table 定义中:
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
。
对于第二部分,您提供了一个类似于您问题中的映射。它应该是 to/from 您要使用的数据类型 (DateTime) 到对 DATETIME
列有意义的类型。例如,MySQL 文档指示格式为:YYYY-MM-DD HH:MM:SS
。那么您的映射函数应该能够接受和生成该格式的 String
类型。
作为替代方案...
从 Slick 3.3.0 开始,有 built-in support for the java.time
数据类型。 Java 中没有 DateTime
,但 Java LocalDateTime
或 ZonedDateTime
可能会满足您的需要。在这种情况下,不需要映射或 O.SqlType
.
对于 slick 3.3.0,我找到了另一个解决方法。 (它应该也适用于其他版本)
def cusDateTimeCol = column[LocalDateTime]("cusDateTimeCol", O.SqlType("datetime"))(localDateTimeMapper)
范围如下。 (使用特征并将其导入 table 定义)
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
implicit def LocalDateTimeToStr(d: LocalDateTime): String = {
d.format(formatter)
}
implicit def strToLocalDateTime(s: String): LocalDateTime = {
LocalDateTime.parse(s, formatter)
}
implicit val localDateTimeMapper = MappedColumnType.base[LocalDateTime, String](
LocalDateTimeToStr(_),
strToLocalDateTime(_)
)
使用此设置,代码将 read/write 日期时间格式 YYYY-mm-dd HH:mm:ss
而不是通常的 ISO 格式。