2013-10-04 48 views
5

Tôi đang cố gắng kết nối với Postgres của Heroku bằng Go. Tất cả đều hoạt động tốt tại địa phương.Kết nối bị từ chối với Go + Postgres trên Heroku

Lỗi tôi nhận được trên Heroku là dial tcp 127.0.0.1:5432: connection refused.

Tôi đã xác nhận khả năng kết nối với cơ sở dữ liệu thông qua psql trên dòng lệnh của heroku và đã xác nhận rằng cấu hình url cơ sở dữ liệu là chính xác. Mã là đủ rõ ràng, vì vậy tôi tự hỏi nếu có một vấn đề cấp thấp hơn.

Mã này là đủ đơn giản:

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 
} 

... và đang nhập khẩu github.com/lib/pq. Phiên bản đi là 1.1.2.

Trả lời

9

Heroku + Go khá cụ thể về các chuỗi kết nối. Kiểu URL dường như không cho phép đặc tả của sslmode = require, mà Heroku insists upon.

Các phiên bản sửa đổi sử dụng pq để phân tích các URL vào một chuỗi kết nối Postgres truyền thống, và gắn thêm các tham số:

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

Strange ... Tôi chưa bao giờ phải mớ hỗn độn với 'sslmode = require', và Tôi đã làm một cái gì đó rất giống nhau (cũng sử dụng 'lib/pq'). Ngoài ra, thực tiễn không tốt để bao gồm chi tiết kết nối DB trong mã của bạn. Heroku cho phép bạn thiết lập các biến môi trường, mà mã của bạn có thể truy cập bằng cách sử dụng 'os.Getenv()'. Chúc may mắn! :) – weberc2

Các vấn đề liên quan