2017-02-19 110 views
1

我定義我的Postgres數據庫作爲Clojure的 - Postgres的沒有合適的驅動程序找到

(def db {:subprotocol "postgresql" 
     :subname "//localhost:5432/mydb" 
     :user "admin" 
     :password "password"}) 

我還定義一個函數

(defn get-users [] 
    (sql/query db ["select * from users"])) 

其中SQL是[clojure.java.jdbc :as sql]

如果我跑(get-users)我得到錯誤

SQLException No suitable driver found for jdbc:postgresql://127.0.0.1:5432/mydb java.sql.DriverManager.getConnection (DriverManager.java:689) 

我從其他Java帖子看到我需要使用加載驅動程序Class.forName("org.postgresql.Driver");

1)這是什麼意思?

2)我該怎麼做/解決我在Clojure中的錯誤?

回答

2

的解決方案是在這您project.clj添加到您的:dependencies

[org.postgresql/postgresql "42.1.4"] 

另外,雖然你的數據庫定義是好的,而不是的連接字符串,您還可以單獨定義主機,端口和數據庫名稱,這使得它更加模塊化和可組合的情況下,它們中的任何一個變化:

(def db {:dbtype "postgresql" 
     :dbname "mydb" 
     :host "localhost" 
     :port 5432 
     :user "userrole" 
     :password "password"}) 
+0

根據我的評論,這個答案只是跳過包含'project.clj'的問題。它顯示瞭解決問題的一部分,但並未回答所述的問題。最後,它填充了關於':subname'組合性的無關性。 –

1

這意味着JVM需要在可以使用驅動程序之前加載Postgres驅動程序類。 sql/query調用使用驅動程序。通常在Java類中實例化,所以該類自動加載。但請注意,您的代碼沒有new,也沒有調用靜態工廠(構造函數)方法。通過調用sql/query,您實際上直接調用了函數java.sql.DriverManager.getConnection,而沒有加載類DriverManager。推測載入Driver加載DriverManager

http://clojure-doc.org/articles/language/interop.html我發現這一點:

(Class/forName "java.util.Date") 

所以,你可以嘗試:

(Class/forName "org.postgresql.Driver") 
+0

難道我是運行在repl?如果是這樣,我得到的錯誤'ClassNotFoundException org.postgresql.Driver java.net.URLClassLoader $ 1.run(URLClassLoader.java:372)' – rbb

+0

很好包括你的'project.clj'在問題中,所以可以看出,如果你包括Postgres驅動程序jar - 你需要把它放到你的maven repo(.m2)中。 –

相關問題