【问题标题】:composing single insert statement in slick 3在 slick 3 中编写单个插入语句
【发布时间】:2015-12-11 19:52:02
【问题描述】:

这是代表整行的案例类:

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

我有一个形状案例类,它只“公开”列的子集,并在用户创建/更新客户时使用:

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

我可以使用CustomerForm 进行更新。但是我不能将它用于插入。有一些不在CustomerForm 中的列是必需的(非空),只能由服务器提供。我现在要做的是从CustomerForm 创建CustomerRow

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)

?

【问题讨论】:

    标签: slick slick-3.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。

    【讨论】:

      猜你喜欢
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      • 2021-01-11
      相关资源
      最近更新 更多