2012-11-01 8 views
8

ich die postgresql uri in meinen Config-Einstellungen auf Heroku bin Parsen. Aber ich kann es nicht funktionieren lassen. Jede Hilfe würde sehr geschätzt werden, ich vermisse wahrscheinlich etwas direktes.Ärger mit Korma (Clojure) PostGreSQL DB auf Heroku Anschluss

Hier ist der Code verwendet.

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

Die Karte, die ich aus dem uri abrufen sieht wie folgt aus:

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

Ich erhalte die folgende Fehlermeldung:

Connections could not be acquired from the underlying database! 

EDIT:

Ich habe auf seit aufgegeben Korma verwenden und umgeschaltet unter Verwendung von Clojure.JDBC 0.2.3 die „verbindungs ​​uri“, und daher ssl Verbindungen zum D unterstützt b. Korma unterstützt dies derzeit nicht. Ich werde ein Problem auf Github einreichen, um diese Verbindungsmethode zu ermöglichen.

+0

Gibt es eine Möglichkeit, die Fehlermeldung aus der zugrunde liegenden Datenbank-Engine zu erhalten - insbesondere der Fehler ausgelöst durch PgJDBC , wenn du das benutzt? "connection refused" oder "no pg_hba.conf entry for ..." usw. –

+0

Ich schaue mal nach Craig. Ich denke, es gibt eine db anmelden postgres.heroku – conorwade

+0

Hier ist die Protokollmeldung - FATAL: keine pg_hba.conf Eintrag für Host "x.x.x.x", Benutzer "Benutzername", Datenbank "DB-Name", SSL aus – conorwade

Antwort

5

EDIT: Es gibt keinen Grund [org.clojars.ccfontes/korma "0.3.0-beta12-pgssl"] mehr zu verwenden. Lesen this mehr darüber zu wissen. Bitte ignorieren Sie auch die folgenden Anweisungen.

Added postgres SSL Unterstützung.

In project.clj Einsatz: [org.clojars.ccfontes/korma "0.3.0-beta12-pgssl"]

eine Verbindung zu einer Postgres-Datenbank auf Heroku definieren:

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

Das Update verwendet Tomcat JDBC Connection Pool und deren Konfiguration Beispiel für die Verbindung Pool, so kann es nicht gut sein geeignet für alle Bedürfnisse, und das ist nur ein Hack. Im Idealfall sollte das ursprüngliche Korma Projekt diese Änderungen oder andere mögliche Lösung integrieren.

Würde mich über Feedback von anderen Leuten freuen, da es nur in meinem eigenen Projekt getestet wurde. Vielen Dank.

0

FWIW, hier ist der Code, den ich verwendet habe, um eine clojure.java.jdbc db-spec (die ich denke, was Korma will) von 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

Danke für die Antwort Ich habe Ihren Code versucht, und leider hat es nicht funktioniert. Ich habe einige Änderungen für Tippfehler gemacht, z. Zeile 6 - "def db" ist jetzt "defdb dbname". Ich habe gearbeitet, bis ich die Verbindung hergestellt habe und ich habe den gleichen Fehler bekommen. :( – conorwade

+0

Gibt es vielleicht eine Option zum Hinzufügen einer SSL-Verbindung zu Korma oder der zugrunde liegenden JDBC? Argh das ist jetzt ziemlich frustrierend. Ich habe die ganze App bereit zu gehen außer für diese. – conorwade

1

Eigentlich ist die Lösung sehr einfach und funktioniert nur lokal:

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

Wo DATABASE_URL „Postgres ist: // user: pw @ host: port/dbname ssl = true & sslfactory = org.postgresql?. ssl.NonValidatingFactory "

Es scheint, der Name der Datenbank leitet die SSL-Parameter an den zugrunde liegenden Treiber weiter und es funktioniert einfach.

Dies ist mit:

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

'(oder Port 80)'? Warum nicht '(oder Port 5432)'? –

1

In Ihrem EDIT Sie clojure.java.jdbc erwähnen Schalen, weil es Ihnen die Verwendung von SSL die Verbindung URI zu ermöglichen, erlaubt. Sie können die gleiche Technik mit Korma mit der Funktion Korma verwenden.und aktivieren Sie SSL mit der Abfrage-String wie folgt db/defdb mit dem Sie Ihre eigene Verbindung URL zur Verfügung stellen können:

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