gpt4 book ai didi

scala - 巧妙维护 updated_at 和 inserted_at 字段

转载 作者:行者123 更新时间:2023-12-02 03:08:15 28 4
gpt4 key购买 nike

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

最佳答案

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

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 和 inserted_at 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41342426/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com