scala - 在 slick 中更新表的前 n 行

标签 scala slick-3.0

我想在使用 slick 3.0 时更新表格的前 n 行而不是整个表格

这是更新所有版本:

private[this] val active = this.filter(a => a.status =!= AccountStatus.DISABLED)
db.run(
    active.filter(a => a.usedBy.isEmpty || a.usedBy === Host.name)
    .map(account => account.usedBy)
    .update("host-a")
)

我尝试使用这个版本,但它不起作用并抛出异常

private[this] val active = this.filter(a => a.status =!= AccountStatus.DISABLED)
db.run(
    active.filter(a => a.usedBy.isEmpty || a.usedBy === Host.name)
    .take(10)
    .map(account => account.usedBy)
    .update(Option(Host.name))
)

异常

Caused by: slick.SlickException: A query for an UPDATE statement must resolve to a comprehension with a single table -- Unsupported shape: Comprehension s2, Some(Apply Function and), None, ConstArray(), None, None, Some(LiteralNode 100 (volatileHint=false)), None
at slick.driver.JdbcStatementBuilderComponent$QueryBuilder.buildUpdate(JdbcStatementBuilderComponent.scala:447)
at slick.driver.JdbcProfile$$anonfun$updateCompiler$1.apply(JdbcProfile.scala:30)
at slick.driver.JdbcProfile$$anonfun$updateCompiler$1.apply(JdbcProfile.scala:30)
at slick.jdbc.JdbcMappingCompilerComponent$JdbcCodeGen.compileServerSideAndMapping(JdbcMappingCompilerComponent.scala:59)

最佳答案

嗯...答案在于您正在尝试做一些 Slick 不应该做的事情。

一个非常简单的指南——当有疑问时用 SQL 思考然后转换为 Slick

想想你将如何在 SQL 中实现这一点,

如果我转换你的“查询”,

// lets say Host.name = "Awesome-Host"

active.filter(a => a.usedBy.isEmpty || a.usedBy === Host.name)
  .take(10)
  .map(account => account.usedBy)
  .update(Option(Host.name))

对SQL来说,就是这样,

UPDATE
    active
SET
    used_by = 'Awesome-Host'
WHERE
    used_by IS NULL
    OR used_by = 'Awesome-Host'
LIMIT 10

从 SQL 的角度来看,这有点荒谬......

现在...让我们谈谈您将如何使用 SQL 实际执行此操作,

UPDATE
    (
        SELECT 
            *
        FROM
            active
        WHERE
            used_by IS NULL
            OR used_by = 'Awesome-Host'
        LIMIT 10
    ) active_selection
SET
    active_selection.used_by = 'Awesome-Host'

并且...这可以使用子查询转换为 Slick

val activeSelection = active
  .filter(a => a.usedBy.isEmpty || a.usedBy === Host.name)
  .take(10)

val updateSelection = activeSelection
  .map(a => a.usedBy)
  .update(Option(Host.name))

关于scala - 在 slick 中更新表的前 n 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41311802/

相关文章:

scala - Spark SQL 查找列中的最小值并获取整行

scala - scala REPL 打印的是实例名称/id 吗?

scala - "Appending"通过 Enumeratee 到 Enumerator 的元素

slick-3.0 - 是否可以使用 Akka Stream 从数据库表创建 "infinite"流

scala - Slick 3.1.1 模糊隐式值涉及过滤器和隐式 CanBeQueryCondition

mysql - Slick 3.1.1 没有创建唯一约束

html - 使用@helper.inputText ("property"时不在输入框前显示文本)

scala - Play Framework 2.1 - 找不到隐式 ExecutionContext

scala - 无法在带有 3.0.0-RC1 的 TableQuery 上找到方法结果

scala - 是否可以将 sbt testOnly 与 Slick TestKit 一起使用?