составление одного оператора вставки в пятне 3

Это класс case, представляющий всю строку:

case class CustomerRow(id: Long, name: String, 20 other fields ...)

У меня есть класс формы, который «открывает» только подмножество столбцов и используется, когда пользователь создает/обновляет клиента:

case class CustomerForm(name: String, subset of all fields ...)

Я могу использовать CustomerForm для обновлений. Однако я не могу использовать его для вставок. Есть некоторые столбцы, которых нет в CustomerForm, но они обязательны (не нулевые) и могут быть предоставлены только сервером. Теперь я создаю CustomerRow из CustomerForm:

def form2row(form: CustomerForm, id: Long, serverOnlyValue: Long, etc...) = CustomerRow(
   id = id,
   serverOnlyColumn = serverOnlyValue,
   name = form.name.
   // and so on for 20 more tedious lines of code
)

и использовать его для вставки.

Есть ли способ составить вставку в slick, чтобы я мог удалить эту утомительную функцию form2row?

Что-то вроде:

(customers.map(formShape) += form) andAlsoOnTheSameRow .map(c => (c.id, c.serverOnlyColumn)) += (id, someValue)

?


person Milan Satala    schedule 09.12.2015    source источник


Ответы (1)


Да, вы можете сделать это так:

 case class Person(name: String, email: String, address: String, id: Option[Int] = None)

 case class NameAndAddress(name: String,address: String)

 class PersonTable(tag: Tag) extends Table[Person](tag, "person") {
    val id = column[Int]("id", O.PrimaryKey, O.AutoInc)
    val name = column[String]("name")
    val email = column[String]("email")
    val address = column[String]("address")
    //for partial insert 
    def nameWithAddress = (name, address)<>(NameAndAddress.tupled, NameAndAddress.unapply)

    def * = (name, email, address, id.?) <> (Person.tupled, Person.unapply)

    }

    val personTableQuery = TableQuery[PersonTable]

 // insert partial fields 
  personTableQuery.map(_.nameWithAddress) += NameAndAddress("abc", "xyz")

Убедитесь, что вы знаете поля, допускающие значение NULL, они должны быть в форме Option[T], где T — это тип поля. В моем примере электронная почта должна быть Option[String] вместо String.

person Sky    schedule 11.12.2015