1

我写了这个非常简单的代码,我在互联网上的很多地方都看到过

import scala.slick.driver.H2Driver.simple._
import scala.concurrent.ExecutionContext.Implicits.global
import slick.jdbc.meta._
import scala.concurrent._
import ExecutionContext.Implicits.global
import scala.concurrent.duration._

object Helper {
  def printTableNames() : Unit = {
    val db = Database.forConfig("test1")
    db.withSession {implicit session =>
      val x = Await.result(MTable.getTables().list(), Duration.Inf).toList
      x.foreach(println)
    }
  }
}

但这在运行时给了我一个神秘的错误

[error] /Users/abhi/ScalaProjects/SlickTest/src/test/scala/HelloSpec.scala:13: overloaded method value getTables with alternatives:
[error]   => slick.profile.BasicStreamingAction[Vector[slick.jdbc.meta.MTable],slick.jdbc.meta.MTable,slick.dbio.Effect.Read] <and>
[error]   (namePattern: String)slick.profile.BasicStreamingAction[Vector[slick.jdbc.meta.MTable],slick.jdbc.meta.MTable,slick.dbio.Effect.Read] <and>
[error]   (cat: Option[String],schemaPattern: Option[String],namePattern: Option[String],types: Option[Seq[String]])slick.profile.BasicStreamingAction[Vector[slick.jdbc.meta.MTable],slick.jdbc.meta.MTable,slick.dbio.Effect.Read]
[error]  cannot be applied to ()
[error]       val x = Await.result(MTable.getTables().list(), Duration.Inf).toList
[error]                                   ^
[error] one error found
[error] (test:compileIncremental) Compilation failed
[error] Total time: 1 s, completed Jun 27, 2015 12:34:03 AM
4

2 回答 2

1

这个

  val x = Await.result(MTable.getTables().list(), Duration.Inf).toList

应该

  val x = Await.result(MTable.getTables(), Duration.Inf).toList

x 也会为您获取 MTable 的列表,例如

List(
  MTable(MQName(TEST.PUBLIC.arguments),TABLE,,None,None,None)
  ...
)

如果您只需要名称,您可以从中获取名称。

于 2015-06-27T09:13:55.483 回答
1

看起来有三种getTables方法都不匹配getTables()。可能您正在尝试那个getTables(不带括号)?

有了这个,你就可以调用 just list(not list())。列表的光滑定义:

/** Execute the statement and return an immutable and fully materialized list of the results. */
final def list(implicit session: JdbcBackend#Session) = build[List[R]]

显示如何没有非隐式参数列表。因此,您想要list而不是list().

但是...我看到返回的对象是一个流,这意味着getTables返回一个流(db.stream而不是db.run)。如果您想要列表而不是流,请删除此不必要的步骤并db.run改用。

把所有这些放在一起,这应该可以工作,假设你想使用流(鉴于我到目前为止所知道的):

 Await.result(MTable.getTables, Duration.Inf).toList

(PS,如果您提及您使用的 Slick 版本会有所帮助。Slick 3 与旧版本非常不同。)

于 2015-06-27T11:51:59.450 回答