2013-10-04 152 views
5

我試圖用Go去連接Heroku的Postgres。所有工作都很好。拒絕連接Go + Postgres在Heroku上

我在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風格似乎不允許指定sslmode = require,這是Heroku insists upon

修改後的版本使用PQ解析URL到傳統的Postgres連接字符串,並添加參數:

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')。此外,在代碼中包含數據庫連接詳細信息也是不好的做法。 Heroku允許你設置環境變量,你的代碼可以使用'os.Getenv()'來訪問。祝你好運! :) – weberc2