2017-02-19 5 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) I получить сообщение об ошибке

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

Решение добавить это к вашему :dependencies в вашем project.clj:

[org.postgresql/postgresql "42.1.4"] 

Кроме того, в то время как ваше определение db в порядке, вместо конкатенированной строки для :subname, вы можете также отдельно определить хост, порт и имя БД, что делает его более модульным и компонуемы в случае, если какой-либо один из них изменяет:

(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, которую вам нужно будет поместить в ваш maven repo (.m2). –

 Смежные вопросы

  • Нет связанных вопросов^_^