2016-12-27 61 views
3

大多數我的數據庫錶款都必須在創建和更新事件分別進行更新inserted_at的updated_at時間戳字段。是否有可能在Slick中以最乾燥,最透明的方式進行此操作。我的表格投影(*)中也不需要這些審計列,僅用於審計和調試。一種選擇是使用像下面這樣的自定義Sqltype。保持光滑和的updated_at領域inserted_at

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不支持它。

+0

您需要支持多少個數據庫? –

+0

理想情況下,寧願有一個數據庫中立的解決方案..但在我的情況下,最低2(MySQL和H2).. –

回答

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

遠,但應該做你在某些更復雜的情況需要什麼。