查询 Postgres 数据库 - Clojure

Posted

技术标签:

【中文标题】查询 Postgres 数据库 - Clojure【英文标题】:Querying a Postgres Database - Clojure 【发布时间】:2017-02-18 15:19:35 【问题描述】:

我正在尝试查询在我的机器上本地设置的 postgres 数据库。

我已经创建了一个文件

(ns website.db
  (:require [clojure.java.jdbc :as jdbc]))

(def database
  :classname "com.postgres.jdbc.Driver"
   :subprotocol "postgres"
   :subname "mydb" ; In the guide this was //127.0.0.1:3306/mydb. Is the first part my computer IP address?
   :user "admin"
   :password "secret")

如果我尝试使用(在 REPL 中)查询数据库

(jdbc/query database ["SELECT * FROM table"])

我收到错误ConnectException Connection refused java.net.PlainSocketImpl.socketConnect (PlainSocketImpl.java:-2)

注意我希望数据库是空的,因为我没有在数据库中输入任何信息

我在定义数据库时犯了什么错误?

插入用户是正确的:

(defn register-user! [db name]
  (jdbc/insert! db :user :name name))

【问题讨论】:

根据 github 上官方 repo 上的示例 github 你的数据库定义应该类似于 (def pg-db :dbtype "postgresql" :dbname "mypgdatabase" :host "mydb.server.com" :user "myuser" :password "secret" :ssl true :sslfactory "org.postgresql.ssl.NonValidatingFactory") 【参考方案1】:

clojure.java.jdbc 文档站点没有涵盖所有可能性,也没有太多细节。

我会向您指出 the doc of get-connection 功能非常广泛:

(...) db-spec is usually a map containing connection
  parameters but can also be a URI or a String. The various possibilities are described
  below:
  DriverManager (preferred):
    :dbtype      (required) a String, the type of the database (the jdbc subprotocol)
    :dbname      (required) a String, the name of the database
    :host        (optional) a String, the host name/IP of the database
                            (defaults to 127.0.0.1)
    :port        (optional) a Long, the port of the database
                            (defaults to 3306 for mysql, 1433 for mssql/jtds, else nil)
    (others)     (optional) passed to the driver as properties.
  Raw:
    :connection-uri (required) a String
                 Passed directly to DriverManager/getConnection
  Other formats accepted:
  Existing Connection:
    :connection  (required) an existing open connection that can be used
                 but cannot be closed (only the parent connection can be closed)
  DriverManager (alternative / legacy style):
    :subprotocol (required) a String, the jdbc subprotocol
    :subname     (required) a String, the jdbc subname
    :classname   (optional) a String, the jdbc driver class name
    (others)     (optional) passed to the driver as properties.
  Factory:
    :factory     (required) a function of one argument, a map of params
    (others)     (optional) passed to the factory function in a map
  DataSource:
    :datasource  (required) a javax.sql.DataSource
    :username    (optional) a String
    :user        (optional) a String - an alternate alias for :username
                            (added after 0.3.0-beta2 for consistency JDBC-74)
    :password    (optional) a String, required if :username is supplied
  JNDI:
    :name        (required) a String or javax.naming.Name
    :environment (optional) a java.util.Map
  java.net.URI:
    Parsed JDBC connection string (see java.lang.String format next)
  java.lang.String:
    subprotocol://user:password@host:post/subname
                 An optional prefix of jdbc: is allowed."

最新的clojure.java.jdbc 版本还包括Clojure specs for db-spec map。

你的情况可能是:

:dbtype "postgresql")
 :dbname "mydb"
 :host "127.0.0.1"
 :port 5432
 :user "admin"
 :password "secret"

【讨论】:

【参考方案2】:

你的配置很好,当我使用我自己的本地 postgres 数据库时,它对我有用,尽管另一个答案中给出的配置是更干净的 IMO。

做这种事情的最佳方法是在尝试以编程方式进行之前,能够使用第三方客户端与数据库通信。

假设您使用的是 *nix 操作系统,您应该能够使用 psql 来管理数据库。创建您的角色,分配密码,创建数据库,创建表,然后在表中插入一两行。在 postgres 配置中,关闭 ssl,以使其保持简单,直到您可以正常工作,然后在需要时添加它。

最困难的部分是正确地获取 postgres 配置。一旦您验证了访问权限并与psql 一起使用,那么 clojure 部分就很简单了。

FWIW,您应该拥有的工作和最新版本的依赖项是:

[org.clojure/java.jdbc "0.7.0-alpha1"]
[postgresql/postgresql "9.3-1102.jdbc41"]

【讨论】:

我认为@Josh 是在正确的轨道上。默认情况下,在许多 *nix 平台上,数据库设置为只允许本地域套接字而不是 tcp。检查您的 postgresql 配置并确保您可以使用用户名和密码连接到数据库。

以上是关于查询 Postgres 数据库 - Clojure的主要内容,如果未能解决你的问题,请参考以下文章

clojure jdbc postgres:为啥我的查询结果将表名中的 unicode 字符返回为 �?

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

clojure连接postgres

在 clojure.jdbc 和 postgres 中使用保存点进行测试的嵌套事务

java.jdbc clojure 执行!插入数量

Clojure 测试中的数据库模拟