光滑:更新数据库中的列表

阿里娜·乌拉诺娃(Arina Ulanova)

我在Postgres中的表格架构如下:

在此处输入图片说明

我将List [String]存储在第二列中,并且编写了一种工作方法,该方法使用新列表和旧列表的并集来更新此列表:

  def update(userId: Long, unknownWords: List[String]) = db.run {
    for {
      y <- lists.filter(_.userId === userId).result
      words = y.map(_.unknownWords).flatMap(_.union(unknownWords)).distinct.toList
      x <- lists.filter(_.userId === userId).map(_.unknownWords).update(words)
    } yield x
  }

有什么办法可以写得更好吗?也许问题是很愚蠢的,但是我不太明白为什么我应该将.result()应用于for表达式的第一行,所以3d行上的filter()。map()链工作正常,是类型有问题吗?

理查德·达拉威

为什么 .result

您需要应用的原因.resultSlick中查询(Query类型)和操作(DBIO之间的差异有关

就其本身而言,该lists.filter行是一个查询。但是,第三行(update)是一个动作。如果您.result不进行理解,则aQueryDBIO(action)之间的类型将不匹配

因为您要db.run获取for理解的结果,所以for理解需要产生一个DBIO操作而不是一个查询。换句话说,放一个.result正确的东西是正确的,因为您正在构造要在数据库中运行的操作(即为用户获取一些数据)。

然后,您稍后update将对数据库运行另一个操作因此,总的来说,您是for在将两个操作(两个可运行的SQL表达式)组合到一个DBIO中。那就是x您的收益,由执行db.run

更好?

这为您工作,这很好。

有少量重复。您可能会在第一行发现查询,这与更新查询非常相似。您可以将其抽象为一个值:

val userLists = lists.filter(_.userId === userId)

那是一个查询。实际上,您可以更进一步,并修改查询以仅选择unknownWords列:

val userUnknownWords = lists.filter(_.userId === userId).map(_.unknownWords)

我没有尝试编译它,但这会使您的代码如下:

def update(userId: Long, unknownWords: List[String]) = {
  val userUnknownWords = lists.filter(_.userId === userId).map(_.unknownWords)
  db.run {
    for {
      y <- userUnknowlWords.result
      words = y.flatMap(_.union(unknownWords)).distinct.toList
      x <- userUnknownWords.update(words)
    } yield x
  }

假设您要组成两个动作(一个select和一个update),则可以DBIO.flatMap代替for理解。您可能会发现它更清晰。或不。但这是一个例子

关于参数的争论DBIO.flatMap需要采取另一种行动。也就是说,flatMap是一种对动作进行排序的方法。特别是,这是在使用数据库中的值时执行此操作的一种方法。

因此,您可以将for理解替换为:

val action: DBIO[Int] =
  userUnknowlWords.result.flatMap { currentWords =>
      userUnknownWords.update(
        currentWords.flatMap(_.union(unknownWords)).distinct.toList
      )
  }

(同样,对于未编译以上内容,我们深表歉意:我没有类型的详细信息,但希望这能为代码的工作方式增色)。

最终的action是您可以传递给的db.run它返回已更改的行数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更新数据库中的数据列表

来自分类Dev

反复更新对象列表中数据库中的记录

来自分类Dev

反复更新对象列表中数据库中的记录

来自分类Dev

从列表视图项更新 sql 数据库中的表

来自分类Dev

光滑的更新操作在对象刷新到数据库之前返回

来自分类Dev

Codeigniter更新数据库记录列表

来自分类Dev

数据库中结果的数据列表

来自分类Dev

实时更新数据库中的数据

来自分类Dev

更新数据库中的数据值

来自分类Dev

更新SQL数据库中的数据

来自分类Dev

光滑:保存在数据库类中而不扩展表

来自分类Dev

从数据库中的对象检索列表

来自分类Dev

数据库中的JSP下拉列表

来自分类Dev

从PHP中的数据库下拉列表

来自分类Dev

使用列表中的项目更新数据库中的行,Python

来自分类Dev

通过光滑的scala向数据库添加记录

来自分类Dev

Playframework scala 光滑的数据库连接和 aws

来自分类Dev

无法更新数据库中的对象

来自分类Dev

在Lua中更新数据库版本

来自分类Dev

数据库中的Django更新对象

来自分类Dev

在Laravel中更新数据库的多行

来自分类Dev

更新数据库中的信息

来自分类Dev

更新ObjectDataSource中的数据库更改

来自分类Dev

数据库中的数组未更新

来自分类Dev

数据库中的Django更新对象

来自分类Dev

更新数据库中的记录

来自分类Dev

无法更新数据库中的列

来自分类Dev

无法更新数据库中的行

来自分类Dev

无法更新数据库中的字段