【问题标题】:Connect to SQLite database in Slick doesn't work but doesn't throw an error在 Slick 中连接到 SQLite 数据库不起作用但不会引发错误
【发布时间】:2015-07-28 09:22:18
【问题描述】:

因此,Typesafe 的 Slick 的文档非常薄,它的示例适用于 Play,这对在 Eclipse 中工作没有太大帮助。

我尝试连接到我系统上的现有 SQLite 数据库,该数据库由一个表“Maintenance_Request”组成。

import slick.driver.SQLiteDriver.api._
import scala.concurrent.ExecutionContext.Implicits.global

object starter {
  def main(args: Array[String]): Unit = {
    val db = Database.forURL("jdbc:sqlite:/home/sq/workspace/dbFun/IOdb.db", driver = "org.sqlite.JDBC")
    val action = sql"select CATEGORY from MAINTENANCE_REQUEST".as[(Int)]
    db.run(action).foreach(println)
  }
} 

虽然启动程序并没有给我任何结果。此外,如果我更改路径,例如省略一个字符,因此它不是有效路径,不会引发错误!所以我不知道什么是有效的,什么是无效的。

有没有办法知道变量 db 是否连接到数据库? 有什么方法知道 Database.forURL 工作还是失败??

【问题讨论】:

  • 这段代码是否被执行了?您是否尝试过添加一些 println 语句?
  • 是的,我做了,我把它们从帖子的代码中去掉了,但是如果我在代码的末尾做一个 println,它就会被打印出来

标签: sqlite scala slick


【解决方案1】:

我怀疑您看不到结果的原因只是您的主程序在查询完成之前完成。

我的意思是,db.run(action) 的类型将是 Future[Seq[Int]]。调用 foreach 不会阻止结果。 foreachFuture 上的行为在此处注明:

需要注意的是,调用 foreach 组合器并不会在该值可用时阻止遍历该值。相反,foreach 的函数只有在 future 成功完成时才会异步执行。 -- http://docs.scala-lang.org/overviews/core/futures.html

所以你能做的就是等待结果:

import scala.concurrent.Await
import scala.concurrent.duration._
val result = Await.result(db.run(action), 2 seconds)
result.foreach(println)

...这将确保您在程序终止之前看到打印的结果。

关于连接数据库的错误...

  • forUrl 中,如果连接字符串不是有效的可识别方案,您将看到java.sql.SQLException: No suitable driver 等异常
  • 如果您提供了有效的 URL,但数据库名称错误,这将取决于相关数据库。对于 H2,我怀疑 SQLite,您可能会创建一个新的空数据库。您可以在 JDBC URL 中传递一些参数来控制此行为,但这将是特定于驱动程序/数据库的。

【讨论】:

    猜你喜欢
    • 2016-05-11
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多