使用光滑访问postgres不起作用

时间:2017-01-11 05:27:16

标签: postgresql scala slick

我有以下环境scala2.11.8 / akka 2.4.8 / slick 3.1.1 / postgreSQL 9.6

我在application.conf

中完成了以下配置
mydb {
  driver = "slick.driver.PostgresDriver$"
  db {
    url = "jdbc:postgresql://localhost:5432/mydb"
    driver = org.postgresql.Driver
    user="postgres"
    password="postgres"
    numThreads = 10
    connectionPool = disabled
    keepAliveConnection = true
  }
}

数据库访问在类

中完成
package mib
import slick.driver.PostgresDriver.api._
import scala.concurrent.ExecutionContext.Implicits.global
class DBAccess {
  import scala.concurrent.Future
  import scala.concurrent._
  import scala.concurrent.duration._
  import slick.backend.DatabaseConfig
  import slick.driver.JdbcProfile
  import slick.driver.PostgresDriver
  import slick.driver.PostgresDriver.api._  
  import slick.jdbc.JdbcBackend.Database

  println("creating database")
 val dbConfig: DatabaseConfig[PostgresDriver] = DatabaseConfig.forConfig("mydb")
 val db = dbConfig.db
 try{
 val accesspoints = TableQuery[mibPoint] 
  // SELECT * FROM users WHERE username='john'
  val q = for (a <- accesspoints) yield a.mib_id
  val dbAction = q.result
  val f: Future[Seq[String]] = db.run(dbAction)
  Await.result(f, Duration.Inf)
  f.onSuccess { case s => println(s"Result: $s") }
  }
  catch
  {
    case _: Throwable =>println("got some exception")
  }
  finally 
    db.close
}

// this is a class that represents the table I've created in the database
  class mibPoint(tag: Tag) extends Table[(String, Double,Double)](tag, "mib_non_info") {
    def mac_id = column[String]("mib_id",O.PrimaryKey)
    def lat = column[Double]("lat")
    def lng = column[Double]("lng")
    def * = (mib_id, lat,lng)
  }

此类从APP对象调用为

object wmib extends App {    
  val mWBootStrapper =  new bootStrap
  mWBootStrapper.ReadProperties();
  val mdB  = new DBAccess 
}

然而,在跑步之后,我总是得到输出&#34;得到一些例外&#34; 我曾尝试使用slf4j / logback启用日志记录但仍然没有在日志中看到太多。 上面看起来非常微不足道,可能我错过了一些明显的东西。 提前致谢, 维沙尔

我添加了sarvesh建议的异常处理。那太酷了,谢谢你。 然而,我的问题消失了,也没有例外。 发生了什么? 当天早些时候,我曾尝试使用java JDBC方式访问数据库。 即只是为了检查DB和DB访问是否有任何问题。 在这个过程中,我下载并在类路径中添加了postgresDriver。早些时候并非如此。 由于驱动程序现在在路径中,代码才起作用。 由于我没有打印异常,我没有意识到错误。 然后我删除了驱动程序jar,我收到了以下错误。

01:44:08.224 [mydb.db-1] DEBUG slick.jdbc.JdbcBackend.statement - Preparing statement: select "mib_id" from "mibpoint"
01:44:08.224 [mydb.db-1] DEBUG slick.jdbc.DriverDataSource - Driver org.postgresql.Driver not already registered; trying to load it
java.lang.ClassNotFoundException: org.postgresql.Driver
    at java.lang.ClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at slick.util.ClassLoaderUtil$$anon$1.loadClass(ClassLoaderUtil.scala:12)
    at slick.jdbc.DriverDataSource$$anonfun$init$2.apply(DriverDataSource.scala:60)
    at slick.jdbc.DriverDataSource$$anonfun$init$2.apply(DriverDataSource.scala:58)
    at scala.Option.getOrElse(Option.scala:121)

感谢大家的帮助。 维沙尔

5 个答案:

答案 0 :(得分:3)

首次使用Slick时遇到了相同的连接问题。我提交了这个PR,详细介绍了如何连接本地Postgres服务器。

https://github.com/slick/slick/issues/1861#issuecomment-387616310

但基本上尝试编辑build.sbt和application.conf文件:

postgres setup for slick

答案 1 :(得分:0)

我添加了sarvesh建议的异常处理。那太酷了,谢谢你。然而,我的问题消失了,也没有例外。发生了什么?当天早些时候,我曾尝试使用java JDBC方式访问数据库。即只是为了检查DB和DB访问是否有任何问题。在这个过程中,我下载并在类路径中添加了postgresDriver。早些时候并非如此。由于驱动程序现在在路径中,代码才起作用。由于我没有打印异常,我没有意识到错误。然后我删除了驱动程序jar,我收到了以下错误。

clang -E -std=c99 test.c

感谢大家的帮助。维沙尔

答案 2 :(得分:0)

mydb {
  dataSourceClass = "slick.jdbc.DatabaseUrlDataSource"
  properties = {
    driver = "slick.driver.PostgresDriver$"
    url = "postgres://postgresql:postgresql@localhost:5432/mydb"
  }
}

或者..你可以尝试类似的东西,

mydb = {
  dataSourceClass = "org.postgresql.ds.PGSimpleDataSource"
  properties = {
    url = "jdbc:postgresql://localhost:5432/mydb"
    user = "postgres"
    password = "postgres"
  }
  numThreads = 10
}

答案 3 :(得分:0)

你需要在类路径上使用Postgres驱动程序:

尝试将"org.postgresql" % "postgresql" % "42.1.4"添加到您的libraryDependencies。

答案 4 :(得分:0)

2020年答案

您必须确保两件事:

  1. 将驱动程序添加到build.sbt的{​​{1}}:libraryDependencies中。这将导致"org.postgresql" % "postgresql" % "42.2.5"的方法java.sql.DriverManager(类getDrivers中的slick使用该方法)找到驱动程序DriverDataSource
  2. 请确保org.postgresql.Driver中的数据库URL遵循JDBC的完整URL模式,如源代码https://github.com/slick/slick/blob/42d787b4950fe876569b5fd68e98c4e0379ac83c/slick/src/main/scala/slick/jdbc/DatabaseUrlDataSource.scala#L9中所述。例如:application.conf

我的完整配置是:

build.sbt

postgresql://user:password@localhost:5432/postgres

application.conf

libraryDependencies ++= Seq(
      ...,
      "org.postgresql" % "postgresql" % "42.2.5"
    )