Похоже, что вы отбрасываете ошибку, возвращенную из gorm.Open()
.Чтобы точно знать, почему gorm не удалось открыть соединение, вам нужно вывести ошибку.
Вместо:
panic("failed to connect database")
Использование:
panic("failed to connect database: " + err)
Atна первый взгляд, возможно, ваш хост неправильно настроен
host='postgres' port=5432 user=user dbname='db_amex01' password='password'
Должно быть:
host=localhost port=5432 user=user dbname=db_amex01 password=password
Но трудно сказать без ошибки от gorm.Open()
Еще одна вещь, которую стоит отметить;не звоните db.Close()
перед первой проверкой ошибки.Возможно, что в случае ошибки db
может быть nil
, вызывая панику к вызовам любого из db
методов.Вы также дважды вызываете db.Close()
в фрагменте кода, который вы разместили.Не делай этого.Документация Голанга по io.Closer
:
Closer - это интерфейс, который обертывает базовый метод Close.
Поведение Close после первого вызова не определено.Определенные реализации могут документировать свое собственное поведение.
Редактировать (12/12/2018):
Когда я запускал ваш код локально, ошибка, которую я получил от gorm, касалась SSL, потому чтовы используете свой сервер postgres через docker-compose без какой-либо конфигурации SSL.Вы можете добавить флаг sslmode=disable
в строку подключения, чтобы решить эту проблему.
Также в вашем docker-compose.yml
есть опечатка: POSTGRESS_DB
должно быть POSTGRES_DB
.
Вотполный рабочий пример, который я запустил локально:
docker-compose.yml
:
version: '3.6'
services:
postgres:
image: postgres:11.1-alpine
ports:
- '5432:5432'
environment:
POSTGRES_USER: 'test_user'
POSTGRES_PASSWORD: 'test_password'
POSTGRES_DB: 'test_database'
volumes:
- ./init:/docker-entrypoint-initdb.d/
main.go
:
package main
import (
"fmt"
"log"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
)
const (
host = "localhost"
port = "5432"
user = "test_user"
password = "test_password"
dbname = "test_database"
)
func main() {
url := fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable",
user,
password,
host,
port,
dbname,
)
db, err := gorm.Open("postgres", url)
if err != nil {
log.Fatalf("error connecting to database: %v", err)
}
defer db.Close()
if err := db.DB().Ping(); err != nil {
log.Fatalf("error pinging database: %v", err)
}
fmt.Println("Success!")
}