在 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'
在下面的示例中,它显示了如何更新单个列 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'