加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Slick 3.0如何更新变量列列表,该数字仅在运行时知道

发布时间:2020-12-16 18:49:08 所属栏目:安全 来源:网络整理
导读:是否可以更新变量列列表,这个数字仅在运行时通过光滑3.0知道? 下面是我想做的例子(不会编译) var q: Query[UserTable,UserTable#TableElementType,Seq] = userTablevar columns = List[Any]()var values = List[Any]()if (updateCommands.name.isDefined) {
是否可以更新变量列列表,这个数字仅在运行时通过光滑3.0知道?

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

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子句.我的更新方法如下所示

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): _*))
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读