为啥使用 Slick 和 PostgreSQL 播放操作失败并显示“找不到合适的驱动程序”?

Posted

技术标签:

【中文标题】为啥使用 Slick 和 PostgreSQL 播放操作失败并显示“找不到合适的驱动程序”?【英文标题】:Why does Play action fail with "no suitable driver found" with Slick and PostgreSQL?为什么使用 Slick 和 PostgreSQL 播放操作失败并显示“找不到合适的驱动程序”? 【发布时间】:2013-06-07 22:09:30 【问题描述】:

我正在使用本地 Postgres 数据库和 Slick 1.0.0 编写一个使用 Play Framework 2.1.1 的 Scala Web 应用程序,我在这里遇到了似乎矛盾的问题。

这是我遇到的错误:

[SQLException: No suitable driver found for postgres://user:password@localhost:5432/postgres]
56  
57  def instance = Action 
58    Database.forURL("postgres://user:password@localhost:5432/postgres", driver = "org.postgresql.Driver") withSession 
59      val q = Retailer.map(_.name)
60      Ok(views.html.instance(q.list, newRForm))
61    
62  
63

其中userpassword 分别是Postgres 数据库的usernamepassword

在java error (No suitable driver found)我发现:

    您需要使用Class.forName("org.postgresql.Driver"); 在某处加载驱动程序 您的程序的类路径中需要 PostgreSQL 驱动程序的 jar 文件。

Application.scala 我有以下代码块:


  println(ConfigFactory.load().getString("db.default.url"))
  println(Class.forName("org.postgresql.Driver"))
 

重新运行 play compile 会导致:

(Server started, use Ctrl+D to stop and go back to the console...)

[info] play - database [default] connected at jdbc:postgresql://localhost:5432/postgres
[info] play - Application started (Dev)
postgres://user:password@localhost:5432/postgres
class org.postgresql.Driver
[error] application -

! @6ei1nhkop - Internal server error, for (GET) [/instance] ->

play.api.Application$$anon$1: Execution exception[[SQLException: No suitable driver found for jdbc:postgresql://user:password@localhost:5432/postgres]]
        at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.1]
        at play.api.DefaultApplication.handleError(Application.scala:383) [play_2.10.jar:2.1.1]
        at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$17$$anonfun$apply$24.apply(PlayDefaultUpstreamHandler.scala:326) [play_2.10.jar:2.1.1]
        at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$17$$anonfun$apply$24.apply(PlayDefaultUpstreamHandler.scala:324) [play_2.10.jar:2.1.1]
        at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.1]
        at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.1]
java.sql.SQLException: No suitable driver found for jdbc:postgresql://user:password@localhost:5432/postgres
        at java.sql.DriverManager.getConnection(Unknown Source) ~[na:1.7.0_21]
        at java.sql.DriverManager.getConnection(Unknown Source) ~[na:1.7.0_21]
        at scala.slick.session.Database$$anon$2.createConnection(Database.scala:105) ~[slick_2.10-1.0.0.jar:1.0.0]
        at scala.slick.session.BaseSession.conn$lzycompute(Session.scala:207) ~[slick_2.10-1.0.0.jar:1.0.0]
        at scala.slick.session.BaseSession.conn(Session.scala:207) ~[slick_2.10-1.0.0.jar:1.0.0]
        at scala.slick.session.BaseSession.close(Session.scala:221) ~[slick_2.10-1.0.0.jar:1.0.0]

然后我运行play dependencies 并且解析了postgres .jar!

Here are the resolved dependencies of your application:
+--------------------------------------------------------+--------------------------------------------------------+-----------------------------------+
| ←[32mpostgresql:postgresql:9.1-901-1.jdbc4←[0m         | ←[37mats:ats_2.10:1.0-SNAPSHOT←[0m                     | ←[37mAs postgresql-9.1-901-1.jdbc4.jar←[0m |
+--------------------------------------------------------+--------------------------------------------------------+-----------------------------------+

为什么找不到合适的驱动程序?

conf/application.conf

# Database configuration
db.default.driver=org.postgresql.Driver
db.default.url="jdbc:postgres://user:password@localhost:5432/postgres"
db.default.user=user    
db.default.password=password

project/Build.scala

import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build 

  val appName    = "ats"
  val appVersion = "1.0-SNAPSHOT"

  val appDependencies = Seq(
    // Add your project dependencies here, 
    jdbc,
    "com.typesafe.slick" %% "slick"      % "1.0.0",
    "postgresql"         %  "postgresql" % "9.1-901-1.jdbc4"
  )

  val main = play.Project(appName, appVersion, appDependencies).settings(
    // Add your own project settings here    
  )

我的/lib 文件中也有postgresql-9.2-1002.jdbc4.jarslick_2.10-1.0.1-RC1.jar,而我在执行SELECT version(); 时的本地Postgres 版本是9.2.4 postgres 驱动程序解析似乎正在解决但是到 9.1 .jar,当我注释掉应用程序依赖项以让 /lib 单独包含时,/lib 似乎不在 Play 的 CLASSPATH 上。

我知道 Postgres url 是正确的,并且我能够在我的应用程序首次启动时连接到我的数据库。

【问题讨论】:

【参考方案1】:

你把事情搞混了。

然后我看了这个问题,上面写着......

    您需要在某处加载驱动程序。 Class.forName("org.postgresql.Driver"); 您需要在程序的类路径中包含 postgresql 驱动程序 .jar 文件。

这不适用于这种情况。您有一个框架可以为您处理这些事情。您提到的那个问题是描述如何使用“原始”jdbc 访问数据库。


你应该这样做。

首先你可以简化配置部分。 5432 是 postresql 的默认端口,localhost 也是默认主机。用户名和密码应放在 url 之外。

# Database configuration
db.default.driver=org.postgresql.Driver
db.default.url=jdbc:postgres:postgres
db.default.user=user    
db.default.password=password

现在定义正确的 sbt 依赖项。只需从 /lib 文件夹中删除 jar 文件并通过更改 Build.scala appDependencies 来更新您的依赖项以获取最新的 PostgreSQL 驱动程序 (9.2)。请注意,groupId 已从 postgresql 更改为 org.postgresql

val appDependencies = Seq(
  // Add your project dependencies here, 
  jdbc,
  "com.typesafe.slick" %% "slick" % "1.0.0",
  "org.postgresql" % "postgresql" % "9.3-1102-jdbc41"
)

最后,您应该更改控制器以从配置中解析数据源:

def instance = Action 
  Database.forDataSource(DB.getDataSource()) withSession 
    val q = Retailer.map(_.name)
    Ok(views.html.instance(q.list, newRForm))
  

【讨论】:

哼。 forURL vs forDataSource 就像 jdbc 中的驱动程序 vs 数据源 [fernandezpablo85.github.io/2013/04/07/…

以上是关于为啥使用 Slick 和 PostgreSQL 播放操作失败并显示“找不到合适的驱动程序”?的主要内容,如果未能解决你的问题,请参考以下文章

将 Slick 轮播水平箭头更改为带有字体真棒箭头的向上和向下箭头

在 PostgreSQL 和 Slick 中使用自动递增字段

如何在 Slick 轮播项目之间添加空格

使用 Slick、specs2 和 Postgresql 进行 2.4 测试

Slick.js使用方法(响应式轮播插件)

删除不适用于 Play! 2.4、Slick 3 和 PostgreSQL