查询 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 字符返回为 �?