2017-02-18 7 views
0

Я пытаюсь запросить базу данных postgres, которую я установил локально на своей машине.Запрос базы данных Postgres - Clojure

Я создал файл

(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"}) 

Если я затем попытаться запросить базу данных, используя (в РЕПЛ)

(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})) 
+0

Согласно примеру на официальном репо на GitHub [GitHub] (https://github.com/clojure/java .jdbC# example-usage) вы должны определить что-то вроде '(def pg-db {: dbtype" postgresql " : dbname" mypgdatabase " : host" mydb.server.com " : пользователь" myuser " : пароль «секретный» : ssl true : sslfactory «org.postgresql.ssl.NonValidatingFactory»}) ' – wwajerowicz

ответ

2

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:[email protected]: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"} 
0

Вашей конфигурации отлично, и работает для меня, когда я использую свою собственную местную Postgres БД, хотя конфигурации приведено в другом ответе чище ИМО.

Наилучший подход при выполнении такого рода действий заключается в том, чтобы иметь возможность разговаривать с базой данных с использованием стороннего клиента, прежде чем пытаться сделать это программно.

Предполагая, что вы находитесь на операционной системе * nix, вы можете использовать psql для администрирования базы данных. Создайте свою роль, назначьте пароль, создайте базу данных, создайте таблицу и вставьте строку или две в таблицу. В конфигурации postgres отключите ssl, чтобы сохранить его простым, пока вы его не заработаете, а затем добавьте его, если вам это нужно.

Самая сложная часть - это просто получение правильной настройки postgres. После подтверждения доступа и использования с psql, часть clojure тривиальна.

FWIW, работы и до современных версий зависимостей вы должны иметь являются:

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

Я думаю, что @Josh находится на правильном пути.По умолчанию на многих платформах * nix база данных настроена так, чтобы разрешать только локальные сокеты, а не tcp. Проверьте свою конфигурацию postgresql и убедитесь, что вы можете подключиться к базе данных, используя имя пользователя и пароль. –