2016-12-27 14 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")) 

далеко от совершенства, но должны делать то, что вам нужно в некоторых более сложных случаях.

 Смежные вопросы

  • Нет связанных вопросов^_^