首页 > 解决方案 > Scala Slick 类表定义,错误声明 DateTime 列

问题描述

下面是我在创建表定义时在 Datetime 列上出现编译错误的 DB 类。

  1. Created_on 应该在更新当前日期

  2. updated_on 应该只模拟传递的日期。

    包装表

     import play.data.format.Formats.DateTime
     import slick.driver.PostgresDriver.api._
    
    
     object Main {
    
        case class Account(
                       id: Long = 0L,
                       owner: Long,
                       name: String,
                       created_on: DateTime,
                       updated_on: DateTime,
                       author_id: Long,
                       updated_by: Long,
                       external_id: String
    
                     )
    

    类 AccountTable(tag: Tag) 扩展 TableAccount {

    def id  = column[Long]("id")
     def owner= column[Long]("id")
     def name= column[String]("name")
     def created_on= column[DateTime]("created_on")
     def updated_on= column[DateTime]("updated_on")
     def author_id= column[Long]("author_id")
     def updated_by= column[Long]("updated_by")
     def external_id= column[String]("external_id")
    
    
     def * = (owner, name, created_on, 
       updated_on,author_id,updated_by,external_id) <> (Account.tupled, 
       Account.unapply)
    

    }

    }

标签: postgresqlscalaslick

解决方案


我不确定DateTime你使用的是什么类。也许是乔达时代的DateTime课程?

为此,您需要提供从DateTimeSlick 知道的类型(以及对数据库中的列有意义的类型)的映射。例如,您可以映射DateTimeTimestamp

import java.sql.Timestamp
import org.joda.time.DateTime
import org.joda.time.DateTimeZone.UTC

// And in your `Main`...

implicit val jodaDateTimeType =
    MappedColumnType.base[DateTime, Timestamp](
      dt => new Timestamp(dt.getMillis),
      ts => new DateTime(ts.getTime, UTC)
    )

...例如。这是在教 Slick 如何将 from 转换DateTime为它知道的类型 ( Timestamp)。

在Essential Slick的第 5 章中有一个关于这方面的教程。

从 Slick 3.3 开始,内置了对许多标准 Java 时间格式的支持,如发行说明中所述

此外,从 Slick 3 开始,您可以.mapTo在大多数情况下使用映射类。它比阅读要好得多<>

def * = (
  owner, name, created_on, updated_on, author_id, updated_by, external_id
).mapTo[Account]

推荐阅读