首頁  >  文章  >  後端開發  >  無法使用 pgx 連線到 postgres 資料庫 AWS RDS

無法使用 pgx 連線到 postgres 資料庫 AWS RDS

王林
王林轉載
2024-02-14 14:03:071041瀏覽

无法使用 pgx 连接到 postgres 数据库 AWS RDS

php小編子墨在使用pgx連接到Postgres資料庫AWS RDS時遇到了問題。他發現無法成功建立連接,儘管他已經按照官方文件和其他資源提供的指導進行了配置。他嘗試了多種方法,包括檢查資料庫權限、確認網路連線、修改設定檔等,但問題仍然存在。他希望能夠得到解決這個問題的有效方法。

問題內容

我嘗試使用github.com/jackc/pgx/v5 套件在Go 程式中連接到AWS RDS 中的postgres 資料庫,但出現以下錯誤:

failed to connect to `host=xxxxx.xxxxxxx.us-east-1.rds.amazonaws.com user=golangpg database=golangpg`: server error (FATAL: database "golangpg" does not exist (SQLSTATE 3D000))
exit status 1

即使明確指出資料庫不存在也是錯誤,但我已經建立了 RDS 資料庫,我也可以透過 pgAdmin 連接到該資料庫。但是當我嘗試在 Go 程式碼中進行連接時,出現了上述錯誤。

我檢查了以下幾點

  1. 安全群組允許所有流量通過 5432 連接埠
  2. RDS 中啟用公共存取
  3. 能夠透過 pgAdmin 連接到同一資料庫。
package database
    
    import (
        "context"
        "fmt"
        "os"
        "strconv"
    
        "github.com/jackc/pgx/v5"
        "github.com/joho/godotenv"
    )
    
    func PGConnection() *pgx.Conn {
        envErr := godotenv.Load()
        if envErr != nil {
            fmt.Println("Error in loading .env file, ", envErr)
        }
    
        host := os.Getenv("DB_URL")
        port := os.Getenv("DB_PORT")
        user := os.Getenv("DB_USERNAME")
        password := os.Getenv("DB_PASSWORD")
        dbname := os.Getenv("DB_NAME")
    
        portInt, er := strconv.Atoi(port)
        if er != nil {
            fmt.Println("Error in converting string to number", er)
        }
    
        var err error
    
        pgConnString := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=require", host, portInt, user, password, dbname)
    
        pgConn, err := pgx.Connect(context.Background(), pgConnString)
    
        if err != nil {
            fmt.Printf("Unable to connection to database: \n%v\n", err)
            os.Exit(1)
        } else {
            fmt.Println("Database connection establised to db ", dbname)
        }
    
        return pgConn
    }
    
    var Connection *pgx.Conn = PGConnection()

這裡可能有什麼錯誤。即使從 pgAdmin 我也可以建立表,但無法從我的 Go 程式碼連接。

解決方法

該問題是因為您的 RDS PostgreSQL 主機中不存在 資料庫「golangpg」。 94b3e26ee717c64999d7867364b1b4a3 e388a4556c0f65e1904146cc1a846bee<code>RDS識別碼! =資料庫名稱

#我在這裡重新建立您的設定:

PostgreSQL RDS

執行相同的程式碼並得到相同的錯誤:

▶ go run main.go
Unable to connection to database: 
failed to connect to `host=golangdb.xxxx.eu-central-1.rds.amazonaws.com user=postgres database=golangdb`: server error (FATAL: database "golangdb" does not exist (SQLSTATE 3D000))
exit status 1

原因是資料庫「golangdb」不存在在我的PostgreSQL RDS中不存在。

連接到資料庫主機並列出可用的資料庫。

▶ psql --host=golangdb.xxxxx.eu-central-1.rds.amazonaws.com --username=postgres

postgres=> \l
                                                       List of databases
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype     
-----------+----------+----------+-----------------+-------------+-------------
 postgres  | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 
 rdsadmin  | rdsadmin | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8

這也是使用 dbname := "postgres" 有效的原因,因為資料庫存在於主機中。

▶ go run main.go
Database connection establised to db  postgres

建立新資料庫

#
postgres=> CREATE DATABASE golangdb;
CREATE DATABASE
postgres=> \l
                                                       List of databases
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    
-----------+----------+----------+-----------------+-------------+-------------
 golangdb  | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 
 postgres  | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 
 rdsadmin  | rdsadmin | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8

重試 go 程式碼

▶ go run main.go
Database connection establised to db  golangdb

以上是無法使用 pgx 連線到 postgres 資料庫 AWS RDS的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除