Anorm - универсальная вставка

Есть ли способ использовать Anorm как обычный ORM? Я хотел бы иметь метод, который просто вставляет предоставленный элемент.

  def insert[T](element: T)(implicit connection: Connection) = {
    element.insert(connection)
  }

Я определенно могу реализовать это сам, но такое ощущение, что я повторно реализую ORM... В старой версии anorm было это Magic[T], но сейчас я его не вижу


person Dmitry Meshkov    schedule 13.11.2020    source источник


Ответы (1)


В документации четко указано, что Anorm не является ORM (и никогда ею не будет).

Как указано , для вставки или обновления значения T экземпляр Должен быть предоставлен ToStatement typeclass.

Предусмотрены некоторые макросы для автоматической материализации таких экземпляров.

import anorm.{ Macro, SQL, ToParameterList }
import anorm.NamedParameter

case class Bar(v: Int)

val bar1 = Bar(1)

// Convert all supported properties as parameters
val toParams1: ToParameterList[Bar] = Macro.toParameters[Bar]

val params1: List[NamedParameter] = toParams1(bar1)
// --> List(NamedParameter(v,ParameterValue(1)))

val names1: List[String] = params1.map(_.name)
// --> List(v)

val placeholders = names1.map { n => s"{$n}" } mkString ", "
// --> "{v}"

val generatedStmt = s"""INSERT INTO bar(${names1 mkString ", "}) VALUES ($placeholders)"""
val generatedSql1 = SQL(generatedStmt).on(params1: _*)
person cchantep    schedule 13.11.2020