Clojure - Postgres没有找到合适的司机
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Clojure - Postgres没有找到合适的司机相关的知识,希望对你有一定的参考价值。
我已将我的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中解决我的错误?
解决方案是将它添加到project.clj中的:dependencies
:
[org.postgresql/postgresql "42.1.4"]
此外,虽然您的数据库定义很好,而不是:subname
的连接字符串,您还可以单独定义主机,端口和数据库名称,这使得它更加模块化和可组合,以防其中任何一个更改:
(def db {:dbtype "postgresql"
:dbname "mydb"
:host "localhost"
:port 5432
:user "userrole"
:password "password"})
这意味着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")
以上是关于Clojure - Postgres没有找到合适的司机的主要内容,如果未能解决你的问题,请参考以下文章
在 clojure.jdbc 和 postgres 中使用保存点进行测试的嵌套事务
clojure/java.jdbc 和 postgres:Prepared statments 比字符串连接查询慢 100 倍?
clojure jdbc postgres:为啥我的查询结果将表名中的 unicode 字符返回为 �?