我的大多数数据库表模型都有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/