首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么使用Slick和PostgreSQL时,播放操作会失败,并出现“找不到合适的驱动程序”?

为什么使用Slick和PostgreSQL时,播放操作会失败,并出现“找不到合适的驱动程序”?
EN

Stack Overflow用户
提问于 2013-06-12 06:02:56
回答 1查看 7.9K关注 0票数 17

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

这是我遇到的错误:

代码语言:javascript
复制
[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");

  • You'll加载驱动程序,在程序的类路径中需要
  1. PostgreSQL驱动程序的jar文件。

Application.scala中,我有以下代码块:

代码语言:javascript
复制
{
  println(ConfigFactory.load().getString("db.default.url"))
  println(Class.forName("org.postgresql.Driver"))
} 

重新运行play compile将导致:

代码语言:javascript
复制
(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就被解析了!

代码语言:javascript
复制
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

代码语言:javascript
复制
# 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

代码语言:javascript
复制
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,我的本地postgres版本的SELECT version();9.2.4 Postgres驱动程序解析似乎要解析到9.1 .jar,当我注释掉应用程序的依赖性,让/lib独立包含时,/lib似乎不在Play的CLASSPATH上。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-12 14:40:07

你把事情搞混了。

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

  1. ,你需要在某个地方加载驱动程序。Class.forName("org.postgresql.Driver");
  2. You'll需要在程序的类路径中包含postgresql驱动程序.jar文件。

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

下面是你应该怎么做。

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

代码语言:javascript
复制
# 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

代码语言:javascript
复制
val appDependencies = Seq(
  // Add your project dependencies here, 
  jdbc,
  "com.typesafe.slick" %% "slick" % "1.0.0",
  "org.postgresql" % "postgresql" % "9.3-1102-jdbc41"
)

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

代码语言:javascript
复制
def instance = Action {
  Database.forDataSource(DB.getDataSource()) withSession {
    val q = Retailer.map(_.name)
    Ok(views.html.instance(q.list, newRForm))
  }
}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17054620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档