在 Slick 3.x 中更新多列

Updating more than one column in Slick 3.x

在下面的示例中,它显示了如何更新单个列 PRICE,首先选择一行然后更新它:

val q = for { c <- coffees if c.name === "Espresso" } yield c.price
val updateAction = q.update(10.49)

// Get the statement without having to specify an updated value:
val sql = q.updateStatement

// compiles to SQL:
//   update "COFFEES" set "PRICE" = ? where "COFFEES"."COF_NAME" = 'Espresso'

但是如果我需要更新三列怎么办?这种方法可行吗?

更新

这些是数据库类

class OlapDB(tag: Tag) extends Table[Olap](tag, "olap_queries") {

  def sk = column[Int]("sk", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name")
  def descrip = column[Option[String]]("descrip")
  def notes = column[Option[String]]("notes")
  def mdx = column[String]("mdx")
  def folderSk = column[Int]("folder_sk")
  def lastUpdateUser = column[Option[String]]("last_upd_user")
  def lastUpdateTS = column[Option[LocalDateTime]]("last_upd_ts")(localDateTimeColumnType)
  def version = column[Int]("version")

  def * = (sk, name, descrip, notes, mdx, folderSk, lastUpdateUser, lastUpdateTS, version )
     <>  ((Olap.apply _).tupled, Olap.unapply)
}

case class Olap ( sk: Int, 
                  name: String, 
                  descrip: Option[String], 
                  notes: Option[String], 
                  mdx: String,
                  folderSk: Int,
                  lastUpdateUser: Option[String],
                  lastUpdateTS: Option[LocalDateTime],
                  version: Int)

这可以通过选择所有应更新的列来实现:

  • With for comprehension, using yield:

    val query = for { c <- coffees if c.name === "Espresso" } yield (c.price, c.name)
    val updateAction = query.update((10.49, "Cappuccino"))
    
  • 没有理解,使用map:

    val updateAction = coffees.filter(_.name === "Espresso").map(c => (c.price, c.name)).update((10.49, "Cappuccino"))
    

这两个操作将转换为以下 SQL 查询:

update "COFFEES" set "PRICE" = ?, "COF_NAME" = ? where "COFFEES"."COF_NAME" = 'Espresso'