簡體   English   中英

使用 slick 訪問 postgres 不起作用

[英]Accessing postgres using slick is not working

我有以下環境 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 
}

但是在運行后,我總是得到輸出為“有一些異常”我嘗試使用 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)

感謝大家的幫助。 維沙爾

我第一次使用 Slick 時遇到了同樣的連接問題。 我提交了這個 PR,詳細說明了如何連接本地 Postgres 服務器。

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

但基本上嘗試編輯您的 build.sbt 和 application.conf 文件:

光滑的 postgres 設置

我按照 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)

感謝大家的幫助。 維沙爾

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
}

您需要類路徑上的 Postgres 驅動程序:

嘗試將"org.postgresql" % "postgresql" % "42.1.4"到您的 libraryDependencies。

2020 年的答案

你必須確保兩件事:

  1. 將驅動程序添加到build.sbtlibraryDependencies : "org.postgresql" % "postgresql" % "42.2.5" 這將導致java.sql.DriverManager的方法getDrivers (由類DriverDataSource )找到驅動程序org.postgresql.Driver
  2. 確保application.conf中的數據庫 url 遵循 JDBC 的完整 url 模式,如源代碼中所述: https : //github.com/slick/slick/blob/42d787b4950fe876569b5fd68e98c4e0379ac83c/slick/src/main/scala/光滑/jdbc/DatabaseUrlDataSource.scala#L9 例如: postgresql://user:password@localhost:5432/postgres

我的完整配置是:

生成.sbt

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

應用程序配置文件

slick-postgres {
  profile = "slick.jdbc.PostgresProfile$"
  db {
    dataSourceClass = "slick.jdbc.DatabaseUrlDataSource"
    properties = {
      driver = "org.postgresql.Driver"
      url = "postgresql://postgres:postgres@localhost:5432/postgres"
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM