2016-12-27 1 views
3

La plupart de mes modèles de table de base de données ont inserted_at et updated_at champs d'horodatage qui doit être mis à jour sur les événements de création et de mise à jour respectivement. Est-il possible de le faire d'une manière plus sèche et transparente dans Slick. Ces colonnes d'audit ne sont pas non plus requises dans ma projection Table (*) et sont uniquement utilisées pour l'audit et le débogage. Une option était d'utiliser Sqltype personnalisé comme ci-dessous.lisse maintenir champ updated_at et 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")) 

Mais le code ci-dessus est spécifique à la base de données et H2 ne le supporte pas.

+0

Combien de bases de données devez-vous prendre en charge? –

+0

Idéalement, je préférerais avoir une solution de base de données neutre .. mais dans mon cas un strict minimum de 2 (MySQL et H2) .. –

Répondre

1

Je soupçonne que ce ne sera pas une solution idéale, mais vous pouvez cependant toujours faire quelque chose comme ceci:

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

Cela devrait évidemment être dans une sorte de classe Table commune ou d'un trait que vous auriez plus tard mélanger dans vos définitions de table.

puis ...

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

loin d'être parfait, mais devrait faire ce que vous avez besoin dans certains cas plus compliqués.