Scala slick在现场维护更新的\u和插入的\u

Scala slick在现场维护更新的\u和插入的\u,scala,orm,slick-3.0,Scala,Orm,Slick 3.0,我的大多数数据库表模型都插入了_at和updated_at时间戳字段,这些字段必须分别在创建和更新事件时更新。是否有可能以最干燥、最透明的方式在光滑的环境中进行此操作。我的表投影(*)中也不需要这些审核列,它们仅用于审核和调试。一个选项是使用自定义Sqltype,如下所示 val insertedAt = column[Timestamp]("inserted_at", O.SqlType("TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"))

我的大多数数据库表模型都插入了_at和updated_at时间戳字段,这些字段必须分别在创建和更新事件时更新。是否有可能以最干燥、最透明的方式在光滑的环境中进行此操作。我的表投影(
*
)中也不需要这些审核列,它们仅用于审核和调试。一个选项是使用自定义Sqltype,如下所示

  val insertedAt = column[Timestamp]("inserted_at", O.SqlType("TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"))
  val updatedAt = column[Timestamp]("updated_at", O.SqlType("TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"))

但是上面的代码是特定于数据库的,H2不支持它。

我怀疑这不是一个理想的解决方案,但是您可以始终执行以下操作:

protected def customColumn[T: TypedType](name: String, 
h2Type: SqlType, mySqlType: SqlType)
(implicit driver: BasicDriver): Rep[T] = driver match {
  case H2Driver.api.slickDriver => column[T](name, mySqlType)
  case MySQLDriver.api.slickDriver => column[T](name, h2Type)
  case _ => throw new IllegalArgumentException("Only MySQL and H2 profiles are supported...")
}
这显然应该是您的公共
类中的某种类型,或者是您稍后将混合到表定义中的某种特性

然后

val insertedAt = customColumn[Timestamp]("inserted_at",
                     O.SqlType("TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"), 
                     O.SqlType("TIMESTAMP... whatever works for MySql"))

val updatedAt = customColumn[Timestamp]("updated_at", 
                     O.SqlType("TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"), 
                     O.SqlType("TIMESTAMP... whatever works for MySql"))

远非十全十美,但在某些更复杂的情况下,您应该做您需要的事情。

您需要支持多少数据库?理想情况下,您希望有一个与数据库无关的解决方案。。但在我的例子中,最小值为2(MySQL和H2)。。