Clojure - Postgres没有找到合适的司机

问题描述 投票:2回答:2

我已将我的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中解决我的错误?

postgresql clojure
2个回答
3
投票

解决方案是将它添加到project.clj中的:dependencies

[org.postgresql/postgresql "42.1.4"]

此外,虽然您的数据库定义很好,而不是:subname的连接字符串,您还可以单独定义主机,端口和数据库名称,这使得它更加模块化和可组合,以防其中任何一个更改:

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

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") 
© www.soinside.com 2019 - 2024. All rights reserved.