🙄
【Go】pq: database "xxx" does not existにハマった話
はじめに
Cloud Run Jobsから、Cloud SQLへの接続確認をしていました。
正しいデータベースを指定しているはずでしたが、何度やっても、以下のエラーが発生します。
pq: database "xxx" does not exist
なぜでしょうか?
原因
データベース名の末尾に、空白が入っていたことが原因でした。
同じ経験をしたことがある人も多いのではないでしょうか?
解決
デフォルトのデータベース(postgres
)には接続できたので、データベース名の一覧を出力し、データベース名と、接続したいデータベース名が合っているか、それぞれのデータベース名の文字数を出力してみました。
func OpenDB(cfg *config.Config) (*sql.DB, error) {
u := &url.URL{
Scheme: "postgres",
User: url.UserPassword(os.Getenv("PG_USER"), os.Getenv("PG_PASSWORD")),
Host: fmt.Sprintf("%s:%s", os.Getenv("PG_HOST"), os.Getenv("PG_PORT")),
Path: "postgres",
}
db, err := sql.Open("postgres", u.String())
if err != nil {
return nil, err
}
fmt.Println(u.String())
if err := db.Ping(); err != nil {
return nil, err
}
// pg_database からテンプレートDBを除いた一覧を取得
rows, err := db.Query(`
SELECT datname
FROM pg_database
WHERE datistemplate = false
ORDER BY datname;
`)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var dbname string
if err := rows.Scan(&dbname); err != nil {
return nil, err
}
fmt.Println(dbname)
fmt.Println(dbname, dbname == "subsidiary-book-sales-prod", len(dbname), len("your-db-name"))
}
if err := rows.Err(); err != nil {
return nil, err
}
fmt.Println("DB接続に成功しました。")
return db, nil
}
すると、取得したデータベース名が、本来のデータベース名よりも一文字多く、空白が含まれていることがわかりました。
最後に
蓋を開けてみると、単純なヒューマンエラーでしたが、いざエラーに遭遇してみると、頭が混乱してしまいます。
この記事が、同じような問題に遭遇した人の助けになれば幸いです。
Discussion