2012-11-01 12 views
8

Parsuję PostgreSQL w moich ustawieniach konfiguracji na Heroku. Ale nie mogę sprawić, żeby działało. Każda pomoc będzie bardzo doceniona, prawdopodobnie brakuje mi czegoś prostego.Problemy z łączeniem się z postgresql DB na Heroku z Korma (Clojure)

Oto kod używany.

(def dev-db-info 
    {:db "dbname" 
    :user "username"}) 

(defn parse-db-uri 
    [uri] 
    (drop 1 (split uri #"://|:|@|/"))) 

(defn create-map-from-uri 
    [uri] 
    (let [parsed (parse-db-uri uri)] 
    (zipmap [:user :password :host :port :db] parsed))) 

(defn db-info 
    [] 
    (if production? 
    (create-map-from-uri (System/getenv "DATABASE_URL")) 
    dev-db-info)) 

(defdb connected-db 
    (postgres (db-info))) 

Mapa odzyskać z URI wygląda następująco:

{:db "dbname" 
:port "5662" 
:host "ec2-url.compute-1.amazonaws.com" 
:password "pwd" 
:user "username"} 

pojawia się następujący błąd:

Connections could not be acquired from the underlying database! 

EDIT:

Mam ponieważ zrezygnowali za pomocą Korma i przełączono na Clojure.JDBC 0.2.3, który obsługuje połączenia "uri", a zatem połączenia ssl do d b. Korma obecnie nie obsługuje tego. Złożę problem na Github, aby umożliwić tę metodę połączenia.

+0

Czy istnieje jakiś sposób, aby dostać się komunikat o błędzie z silnika bazy podstawowej - konkretnie błąd podniesiony przez PgJDBC , jeśli tego właśnie używasz? "odmowa połączenia" lub "brak wpisu pg_hba.conf dla ...", itp. –

+0

Spojrzę na Craiga. Myślę, że jest dziennik db w postgres.heroku – conorwade

+0

Oto komunikat dziennika - FATAL: brak wpisu pg_hba.conf dla hosta "x.x.x.x", użytkownik "nazwa użytkownika", baza danych "nazwa_bdb", SSL wyłączony – conorwade

Odpowiedz

5

EDIT: Nie ma powodów, by używać [org.clojars.ccfontes/korma "0.3.0-beta12-pgssl"] więcej. Przeczytaj this, aby dowiedzieć się więcej na ten temat. Należy również zignorować następujące instrukcje.

Dodano obsługę postgres SSL.

W project.clj wkładki: [org.clojars.ccfontes/korma "0.3.0-beta12-pgssl"]

Definiowanie połączenia z bazą danych PostgreSQL na Heroku:

(ns app.db 
    (:require [clojure.java.jdbc :as sql] 
       [korma.db :as db] 
       [clojure.string :as string]) 
    (:import (java.net URI))) 

    (defn set-app-pg-db! [mode] 
     (let [db-uri (java.net.URI. (System/getenv "DATABASE_URL"))] 
     (->> (string/split (.getUserInfo db-uri) #":") 
      (#(identity {:db (last (string/split (System/getenv "DATABASE_URL") #"\/")) 
         :host (.getHost db-uri) 
         :port (.getPort db-uri) 
         :user (% 0) 
         :password (% 1) 
         :ssl true 
         :sslfactory (when (= mode :dev) "org.postgresql.ssl.NonValidatingFactory")})) 
      (db/postgres) 
      (db/defdb app-pg-db)))) 

Rozwiązaniem używa Tomcat JDBC Connection Pool i ich próbki konfiguracji puli połączeń, więc nie może być dobrze dopasowany do potrzeb każdego, plus to tylko hack. Idealnie oryginalny projekt Korma powinien zintegrować te zmiany lub inne możliwe rozwiązanie.

Byłbym wdzięczny za opinie od innych osób, ponieważ zostały przetestowane tylko w moim własnym projekcie. Dzięki.

0

FWIW, oto kod Wcześniej użyłem dbjure.java.jdbc db-spec (który według mnie jest taki, jak chce Korma) z Heroku DATABASE_URL.

(def db-uri (java.net.URI. (System/getenv "DATABASE_URL"))) 

(def user-and-password (clojure.string/split (.getUserInfo db-uri) #":")) 

(def db 
    {:classname "org.postgresql.Driver" 
    :subprotocol "postgresql" 
    :user (get user-and-password 0) 
    :password (get user-and-password 1) ; may be nil 
    :subname (if (= -1 (.getPort db-uri)) 
       (format "//%s%s" (.getHost db-uri) (.getPath db-uri)) 
       (format "//%s:%s%s" (.getHost db-uri) (.getPort db-uri) (.getPath db-uri)))}) 
+0

Dzięki za odpowiedź wypróbowałem twój kod i niestety to nie zadziałało. Wprowadziłem kilka poprawek na literówki np. wiersz 6 - "def db" jest teraz "defdb dbname". Pracowałem, dopóki nie nawiązałem połączenia i dostałem ten sam błąd. :( – conorwade

+0

Czy istnieje opcja dodania połączenia SSL do Korma lub bazowego JDBC? Argh, to jest teraz dość frustrujące.Mam całą aplikację gotową do pracy poza tym – conorwade

1

Faktycznie rozwiązanie jest bardzo prosta i po prostu działa lokalnie:

(defn- convert-db-uri [db-uri] 
    (let [[_ user password host port db] (re-matches #"postgres://(?:(.+):(.*)@)?([^:]+)(?::(\d+))?/(.+)" db-uri)] 
    { 
     :user user 
     :password password 
     :host host 
     :port (or port 80) 
     :db db 
    })) 

(def db-spec (postgres 
       (convert-db-uri 
       (config/get "DATABASE_URL")))) 

Gdzie DATABASE_URL to „postgres: // user: pw @ host: port/nazwa_bd ssl = true & sslfactory = org.postgresql?. ssl.NonValidatingFactory "

Wygląda na to, że nazwa db przekazuje parametry SSL do sterownika i działa.

To z:

[korma "0.3.0-beta9"] 
[org.clojure/java.jdbc "0.1.3"] 
[postgresql/postgresql "9.1-901.jdbc4"] 
+0

'(lub port 80)'? Dlaczego nie '(lub port 5432)'? –

1

W tej edycji można wymienić przełączania clojure.java.jdbc ponieważ pozwalał, aby umożliwić połączenie SSL przy użyciu identyfikatora URI. Możesz użyć tej samej techniki z Korma używając funkcji korma.db/defdb który pozwala podać swój własny adres URL połączenia i włączyć SSL za pomocą ciąg kwerendy tak:

(defdb korma-db {:classname "org.postgresql.Driver" 
       :subprotocol "postgresql" 
       :subname "//localhost:5432/test?ssl=true" 
       :user "my-username" 
       :password "my-password"}) 
Powiązane problemy