如何在 Slick 3.x 中进行从 LocalDateTime 到 SQL-DateTime 的范围保留映射?

How to do a range-preserving mapping from LocalDateTime to SQL-DateTime in Slick 3.x?

我想避免在我的模式中使用 TIMESTAMP 列,而是使用 DATETIME,因为前者的范围有限(请参阅 Year 2038 problem)。因此,我这样定义我的专栏

def valueDate = column[LocalDateTime]("VALUE_DATE", SqlType("DateTime"))(localDateTimeColumnType)

并提供了一个隐式映射(我从网上的某个地方得到的):

implicit val localDateTimeColumnType = MappedColumnType.base[LocalDateTime, Timestamp](
  d => Timestamp.from(d.toInstant(ZoneOffset.ofHours(0))),
  d => d.toLocalDateTime
)

这行得通,但是通过使用 java.sql.Timestamp 我仍然受限于范围,即使我的数据库列是 DATETIME。我尝试使用基于字符串的映射,但它不起作用:

implicit val localDateTimeColumnType = MappedColumnType.base[LocalDateTime, String](
  d => d.format(DateTimeFormatter.ofPattern("YYYY-MM-DD HH:MM:SS")),
  d => LocalDateTime.parse(d, DateTimeFormatter.ofPattern("YYYY-MM-DD HH:MM:SS"))
)

由于某些原因,插入语句失败(调用 Futures onFailure 回调)。我想知道一个工作范围保持映射器会是什么样子。有什么想法吗?

好的第 1 课:阅读错误消息。

学习了如何在播放回调中显示异常消息后,我得到了这个:

Field DayOfYear cannot be printed as the value 157 exceeds the maximum print width of 2

原来我的日期时间格式是垃圾。正如可以阅读 here,格式必须是 yyyy-MM-dd HH:mm:ss 而不是 YYYY-MM-DD HH:MM:SS。正确的映射如下所示:

implicit val localDateTimeColumnType = MappedColumnType.base[LocalDateTime, String](
    d => d.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),
    d => LocalDateTime.parse(d, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
)