在光滑3中组成单个插入语句

时间:2015-12-09 17:08:15

标签: slick slick-3.0

这是表示整行的案例类:

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
)

并将其用于插入。

有没有办法在光滑中组合插入,这样我就可以删除那个乏味的form2row函数?

类似的东西:

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

1 个答案:

答案 0 :(得分: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")

确保,您知道可以为空的字段,它们应该是Option [T]的形式,其中T是归档类型。在我的示例中,电子邮件应该是Option [String]而不是String。