灵活维护 updated_at 和 inserted_at 字段
slick maintain updated_at and inserted_at field
我的大多数数据库 table 模型都有 inserted_at 和 updated_at 时间戳字段必须分别在创建和更新事件时更新。是否有可能在 Slick 中以最干燥和透明的方式执行此操作。这些审计列在我的 Table 投影 (*
) 中也不是必需的,仅用于审计和调试。一种选择是使用如下所示的自定义 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
class 或您稍后将混合到您的 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"))
远非完美,但在某些更复杂的情况下应该可以满足您的需求。
我的大多数数据库 table 模型都有 inserted_at 和 updated_at 时间戳字段必须分别在创建和更新事件时更新。是否有可能在 Slick 中以最干燥和透明的方式执行此操作。这些审计列在我的 Table 投影 (*
) 中也不是必需的,仅用于审计和调试。一种选择是使用如下所示的自定义 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
class 或您稍后将混合到您的 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"))
远非完美,但在某些更复杂的情况下应该可以满足您的需求。