【问题标题】:slick maintain updated_at and inserted_at field光滑维护updated_at和inserted_at字段
【发布时间】:2016-12-27 21:50:36
【问题描述】:

我的大多数数据库表模型都有 inserted_atupdated_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 不支持它。

【问题讨论】:

  • 您需要支持多少个数据库?
  • 理想情况下希望有一个数据库中立的解决方案.. 但在我的情况下至少有 2 个(MySQL 和 H2)..

标签: scala orm slick-3.0


【解决方案1】:

我怀疑这不是一个理想的解决方案,但您始终可以这样做:

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"))

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

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 2016-10-08
    • 2012-08-27
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多