当没有提供 MySQL java 驱动程序时,Slick 静静地失败

Slick silently fails when no MySQL java driver provided

如果我的 build.sbt

中有这个
libraryDependencies ++= List(
  "com.typesafe.slick" %% "slick" % slickV,
  "org.slf4j" % "slf4j-nop" % "1.6.4",
  "mysql" % "mysql-connector-java" % "5.1.40"
)

然后下面的代码产生预期的结果:

    try{
      db.run((for(visitor <- visitors) yield visitor).result.headOption).map(println(_))
    }catch{
      case e:Throwable => e.printStackTrace()
    }finally db.close()

但是当我从依赖项中删除最后一行 "mysql" % "mysql-connector-java" % "5.1.40" 时,什么也没有发生。我没有打印出结果,但有趣的是我也没有收到任何错误。 这是 Slick 的预期行为吗?你能帮我澄清一下在这种情况下使用的是哪个驱动程序以及会发生什么吗?大概原因在slf4j-nop,会不会是隐藏了任何errors/warnings的输出?

第一个:

将您的代码更改为:

  db.run((
      for(visitor <- visitors) yield visitor).result.headOption).map(println(_)
  ).recover {
      case e: Throwable => e.printStackTrace()
  }.onComplete {
      case _ => db.close()
  }

第二个:

我不知道你 运行 你的代码在哪里,但如果它是 main 方法的某种单元测试,那么你可能会在上面的代码 运行 之前完成执行(记住 db.run 调用异步执行)。

我不会详细说明你应该如何正确处理这个问题(绝对天真wait/sleep不是一种编码方式 - 无论是在生产代码还是在单元测试中)。但是,为了解决您的上述问题,让我们在上面的代码之后添加:

Thread.sleep(5000)

让我们看看它是否有帮助。如果还有其他问题,我们可能会从那里跟进。