Slick 3.0 如何更新变量列列表,只有在运行时才知道哪个数字 [英] Slick 3.0 how to update variable column list, which number is know only in Runtime

查看:43
本文介绍了Slick 3.0 如何更新变量列列表,只有在运行时才知道哪个数字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

slick 3.0 是否可以更新变量列列表,哪个数字只能在运行时知道?

Is it possible to update variable column list, which number is know only in runtime by slick 3.0?

下面是我想要做的示例(不会编译)

Below is example what I want to do (won't compile)

var q: Query[UserTable, UserTable#TableElementType, Seq] = userTable
var columns = List[Any]()
var values = List[Any]()

if (updateCommands.name.isDefined) {
  columns = q.name :: columns
  values = updateCommands.name.get :: values
}

if (updateCommands.surname.isDefined) {
  columns = q.surname :: columns
  values = updateCommands.surname.get :: values
}
q = q.filter(_.id === updateCommands.id).map(columns).update(values)

推荐答案

这是我在 Slick 3.1 中所做的.我不确定更糟的是,编辑纯 SQL 语句或多个查询.所以我决定采用后者,假设 Postgres 优化器会在单个事务的更新查询中看到相同的 WHERE 子句.我的更新方法是这样的

Here is what I've done in Slick 3.1. I wasn't sure what worse, editing plain SQL statement or multiple queries. So I decided to go with latter assuming Postgres optimizer would see same WHERE clause in update queries of single transaction. My update method looks like this

def updateUser(user: User, obj: UserUpdate): Future[Unit] = {

  val actions = mutable.ArrayBuffer[DBIOAction[Int, NoStream, Write with Transactional]]()
  val query = users.withFilter(_.id === user.id)

  obj.name.foreach(v => actions += query.map(_.name).update(v))
  obj.email.foreach(v => actions += query.map(_.email).update(Option(v)))
  obj.password.foreach(v => actions += query.map(_.pwdHash).update(Option(encryptPassword(v))))

  slickDb.run(DBIO.seq(actions.map(_.transactionally): _*))
}

这篇关于Slick 3.0 如何更新变量列列表,只有在运行时才知道哪个数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆