Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在slick中更新表的前n行_Scala_Slick 3.0 - Fatal编程技术网

Scala 在slick中更新表的前n行

Scala 在slick中更新表的前n行,scala,slick-3.0,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) .up

使用
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)

嗯。。。这个问题的答案在于,你正试图做一些斯里克不应该做的事情

一个非常简单的指导原则-当有疑问时,用SQL思考,然后转换为Slick

试想一下,您将如何在SQL中实现这一点

如果我转换你的“查询”

对于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))

课程->如果你不能用SQL做一些事情,那么你就不能用Slick做这些事情。@SarveshKumarSingh哦,你可以用SQL轻松地做到这一点。你为什么这么说?谢谢@Singh,但是第一个SQL转换应该与MySQL一起使用。我使用MySQL。但是,我会尝试第二种情况,看看它是否有效,并让你知道。
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))