2 回答

TA貢獻1770條經驗 獲得超3個贊
您的撰寫文件中有錯字,您將服務命名為 postgre 但連接到 postgres。Docker 在共享網絡上使用服務名稱作為 DNS 別名,因此這會中斷您的連接嘗試。要修復,只需重命名您的服務:
version: '3.6'
services:
postgres:
image: postgres:11.1-alpine
ports:
- '5432:5432'
environment:
POSTGRES_USER: 'user'
POSTGRES_PASSWORD: 'password'
POSTGRESS_DB: 'db_amex01'
volumes:
- ./init:/docker-entrypoint-initdb.d/

TA貢獻1776條經驗 獲得超12個贊
看起來好像您正在丟棄從返回的錯誤gorm.Open()
。要確切知道 gorm 無法打開連接的原因,您需要輸出錯誤。
代替:
panic("failed to connect database")
使用:
panic("failed to connect database: " + err)
一眼看去,可能是你的主機配置錯誤
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()
發布的代碼片段中調用了兩次。不要這樣做。Golang 的文檔io.Closer
:
Closer 是包裝基本 Close 方法的接口。
第一次調用后 Close 的行為未定義。具體的實現可能會記錄他們自己的行為。
編輯(12/12/2018):
當我在本地運行你的代碼時,我從 gorm 得到的錯誤是關于 SSL 的,因為你正在通過 docker-compose 運行你的 postgres 服務器而沒有任何 SSL 配置。您可以將sslmode=disable
標志添加到連接字符串以解決此問題。
docker-compose.yml
您的: POSTGRESS_DB
should be也有錯字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!")
}
- 2 回答
- 0 關注
- 149 瀏覽
添加回答
舉報