2013-10-04 19 views
5

Próbuję połączyć się z Postgres Heroku za pomocą Go. Wszystko działa dobrze lokalnie.Połączenie odmówiono z Go + Postgres na Heroku

Błąd, który otrzymuję na Heroku to dial tcp 127.0.0.1:5432: connection refused.

Potwierdziłem moją zdolność do połączenia się z bazą danych za pośrednictwem psql na linii poleceń heroku i potwierdziłem, że konfiguracja adresu URL bazy danych jest poprawna. Kod jest wystarczająco jasny, więc zastanawiam się, czy istnieje problem niższego poziomu.

Kod jest dosyć prosta:

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 
} 

... i jestem importowania github.com/lib/pq. Wersja Go to 1.1.2.

Odpowiedz

9

Heroku + Go jest dość szczególny w odniesieniu do ciągów połączenia. Styl URL wydaje się nie pozwalać na specyfikację sslmode = require, który Heroku insists upon.

Wersja zmodyfikowana wykorzystuje pq do analizowania URL do tradycyjnego połączenia ciąg Postgres, i dołącza parametr:

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

dziwne ... nigdy nie miałem bałagan z 'sslmode = require' i Zrobiłem coś bardzo podobnego (również używając 'lib/pq'). Niedopuszczalne jest również dołączanie szczegółów połączenia DB do kodu. Heroku umożliwia ustawienie zmiennych środowiskowych, do których twój kod może uzyskać dostęp za pomocą 'os.Getenv()'. Powodzenia! :) – weberc2

Powiązane problemy