2013-10-04 24 views
5

Ich versuche, eine Verbindung zu Herokus Postgres mit einem Go herzustellen. Alles funktioniert gut lokal.Verbindung abgelehnt mit Go + Postgres auf Heroku

Der Fehler auf Heroku ist dial tcp 127.0.0.1:5432: connection refused.

Ich habe meine Fähigkeit bestätigt, über psql auf der Befehlszeile von heroku eine Verbindung mit der Datenbank herzustellen, und habe bestätigt, dass die Konfiguration der Datenbank-URL korrekt ist. Der Code ist klar genug, also frage ich mich, ob es ein niedrigeres Problem gibt.

Der Code ist einfach genug:

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 
} 

... und github.com/lib/pq ist importieren. Go-Version ist 1.1.2.

Antwort

9

Heroku + Go ist ziemlich speziell über die Verbindungszeichenfolgen. Der URL-Stil scheint keine Spezifikation von sslmode = require zu erlauben, was Heroku insists upon.

Die modifizierte Version pq verwendet die URL in eine traditionelle Postgres Verbindungszeichenfolge und fügt den Parameter zu analysieren:

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

Seltsam ... Ich hatte mit 'sslmode = require' zu ​​verwirren nie, und Ich habe etwas sehr ähnliches gemacht (auch mit 'lib/pq'). Außerdem ist es eine schlechte Übung, DB-Verbindungsdetails in Ihren Code aufzunehmen. Mit Heroku können Sie Umgebungsvariablen setzen, auf die Ihr Code mit 'os.Getenv()' zugreifen kann. Viel Glück! :) – weberc2

Verwandte Themen