[英]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 文件:
我按照 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 年的答案:
你必須確保兩件事:
build.sbt
的libraryDependencies
: "org.postgresql" % "postgresql" % "42.2.5"
。 這將導致java.sql.DriverManager
的方法getDrivers
(由類DriverDataSource
)找到驅動程序org.postgresql.Driver
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.