Tidak dapat menyambung ke pangkalan data postgres AWS RDS menggunakan pgx

王林
Lepaskan: 2024-02-14 14:03:07
ke hadapan
1047 orang telah melayarinya

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

Editor PHP Zimo menghadapi masalah apabila menggunakan pgx untuk menyambung ke pangkalan data Postgres AWS RDS. Dia mendapati bahawa dia tidak berjaya mewujudkan sambungan, walaupun dia telah mengkonfigurasinya mengikut panduan yang disediakan oleh dokumentasi rasmi dan sumber lain. Dia mencuba pelbagai kaedah, termasuk menyemak kebenaran pangkalan data, mengesahkan sambungan rangkaian, mengubah suai fail konfigurasi, dll., tetapi masalah itu berterusan. Beliau berharap dapat mencari penyelesaian yang berkesan untuk masalah ini.

Kandungan soalan

Saya cuba menyambung ke pangkalan data postgres dalam AWS RDS dalam program Go menggunakan pakej github.com/jackc/pgx/v5, tetapi saya mendapat ralat berikut:

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
Salin selepas log masuk

Walaupun adalah ralat untuk menyatakan secara jelas bahawa pangkalan data tidak wujud, saya telah mencipta pangkalan data RDS dan saya boleh menyambung kepadanya melalui pgAdmin juga. Tetapi apabila saya cuba menyambung dalam kod Go, saya mendapat ralat di atas.

Saya menyemak perkara berikut

  1. Kumpulan keselamatan membenarkan semua trafik melalui port 5432
  2. Akses awam didayakan dalam RDS
  3. Keupayaan untuk menyambung ke pangkalan data yang sama melalui 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()
Salin selepas log masuk

Mungkin ada sesuatu yang tidak kena di sini. Walaupun dari pgAdmin saya boleh mencipta jadual tetapi tidak boleh menyambung dari kod Go saya.

Penyelesaian

Masalahnya ialah kerana pangkalan data "golangpg" tidak wujud dalam hos RDS PostgreSQL anda. </p> <p><code>RDS标识符!=数据库名称RDS pengecam! =Nama pangkalan data

<小时/>

Saya mencipta semula persediaan anda di sini:

PostgreSQL RDS

Melaksanakan kod yang sama dan mendapat ralat yang sama:

▶ 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
Salin selepas log masuk

Sebabnya 数据库“golangdb”不存在Pangkalan data "golangdb" tidak wujudtidak wujud dalam PostgreSQL RDS saya.

Sambung ke hos pangkalan data dan senaraikan pangkalan data yang tersedia.

▶ 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
Salin selepas log masuk

Ini juga sebabnya menggunakan dbname := "postgres"dbname := "postgres" berfungsi, kerana pangkalan data wujud pada mesin hos.

▶ go run main.go
Database connection establised to db  postgres
Salin selepas log masuk

Buat pangkalan data baharu

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
Salin selepas log masuk

Cuba semula kod go

▶ go run main.go
Database connection establised to db  golangdb
Salin selepas log masuk

Atas ialah kandungan terperinci Tidak dapat menyambung ke pangkalan data postgres AWS RDS menggunakan pgx. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan