我的大多数数据库表模型都有insert_at和updated_at时间戳字段,必须分别在创建和更新事件时对其进行更新。是否可以在Slick中以最干燥和最透明的方式执行此操作。这些审计列在我的表投影(*)中也不是必需的,仅用于审计和调试。一种选择是使用自定义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...")
}

显然,这应该是某种常见的Table类或某些特征,您可以稍后将其混合到表定义中。

接着...
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"))

远非完美,但应在某些更复杂的情况下满足您的需求。

关于scala - 保持维护updated_at和insert_at字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41342426/

10-10 11:27
查看更多