🙄

【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