2013-10-04 34 views
5

Goを使用してHerokuのPostgresに接続しようとしています。すべてがローカルで正常に動作しています。HerokuのGo + Postgresで接続が拒否されました

私がHerokuで受けているエラーはdial tcp 127.0.0.1:5432: connection refusedです。

herokuのコマンドラインでpsqlを使用してデータベースに接続できることを確認し、データベースのURL設定が正しいことを確認しました。コードは十分にクリアなので、低レベルの問題があるのだろうかと思います。

import (
    "database/sql" 
    "github.com/coopernurse/gorp" 
    _ "github.com/lib/pq" 
    "os" 
) 

func openDb() *sql.DB { 
    connection := os.Getenv("DATABASE_URL") 

    db, err := sql.Open("postgres", connection) 
    if err != nil { 
     log.Println(err) 
    } 

    return db 
} 

...とgithub.com/lib/pqをインポートしています:

コードは十分に簡単です。 Goバージョンは1.1.2です。

答えて

9

Heroku + Goは、接続文字列についてかなり特別です。 URLスタイルでは、Heroku insists uponというsslmode = requireの指定を許可していないようです。

修正されたバージョンは、従来のPostgresの接続文字列にURLを解析するPQを使用して、パラメータを追加します:

奇妙な
import (
    "database/sql" 
    "github.com/lib/pq" 
    "os" 
) 

func openDb() *sql.DB { 
    url := os.Getenv("DATABASE_URL") 
    connection, _ := pq.ParseURL(url) 
    connection += " sslmode=require" 

    db, err := sql.Open("postgres", connection) 
    if err != nil { 
     log.Println(err) 
    } 

    return db 
} 
+0

...私は 'SSLMODE = require'を台無しに持っていたことがありませんし、私は非常に似たようなことをやっています( 'lib/pq'も使っています)。また、コードにDB接続の詳細を含めることは悪い習慣です。 Herokuでは環境変数を設定できます。環境変数は 'os.Getenv()'を使ってコードにアクセスできます。がんばろう! :) – weberc2

関連する問題