8

Heroku の構成設定で postgresql uri を解析しています。しかし、私はそれを機能させることができないようです。何か助けていただければ幸いです。おそらく、何かが欠けている可能性があります。

使用したコードはこちら。

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

uri から取得したマップは次のようになります。

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

次のエラーが表示されます。

Connections could not be acquired from the underlying database!

編集:

それ以来、私はKormaの使用をあきらめ、「connection-uri」をサポートするClojure.JDBC 0.2.3の使用に切り替えたため、データベースへのssl接続を使用しました。Korma は現在これをサポートしていません。この接続方法を許可するために、Github で問題を報告します。

4

4 に答える 4

5

編集:[org.clojars.ccfontes/korma "0.3.0-beta12-pgssl"]もう使用する理由はありません。それについてもっと知るためにこれを読んでください。また、以下の指示は無視してください。

postgres SSLサポートが追加されました。

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

heroku で postgres データベースへの接続を定義する:

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

この修正では、Tomcat JDBC 接続プールとその接続プールの構成サンプルを使用するため、すべてのユーザーのニーズにはあまり適していない可能性があります。また、これは単なるハックです。理想的には、元の Korma プロジェクトにこれらの変更またはその他の解決策を統合する必要があります。

自分のプロジェクトでしかテストされていないので、他の人からのフィードバックをいただければ幸いです。ありがとう。

于 2012-11-30T04:21:47.950 に答える
1

実際、ソリューションは非常にシンプルで、ローカルでのみ機能します。

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

DATABASE_URL は「postgres://user:pw@host:port/dbname?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory」です

データベース名がSSLパラメーターを基礎となるドライバーに転送しているようで、うまく機能します。

これは次のとおりです。

[korma "0.3.0-beta9"]
[org.clojure/java.jdbc "0.1.3"]
[postgresql/postgresql "9.1-901.jdbc4"]
于 2013-01-31T12:31:49.333 に答える
1

EDIT では、接続 URI を使用して SSL を有効にできるため、clojure.java.jdbc への切り替えについて言及しています。関数 korma.db/defdb を使用して、Korma で同じ手法を使用できます。これにより、独自の接続 URL を提供し、次のようなクエリ文字列を使用して SSL を有効にすることができます。

(defdb korma-db {:classname "org.postgresql.Driver"
                 :subprotocol "postgresql"
                 :subname "//localhost:5432/test?ssl=true"
                 :user "my-username"
                 :password "my-password"})
于 2013-04-03T22:35:02.367 に答える
0

FWIW、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)))})
于 2012-11-02T15:07:04.673 に答える