Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tidak dapat menyambung ke pangkalan data postgres AWS RDS menggunakan pgx

Tidak dapat menyambung ke pangkalan data postgres AWS RDS menggunakan pgx

王林
王林ke hadapan
2024-02-14 14:03:071041semak imbas

无法使用 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

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()

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. 94b3e26ee717c64999d7867364b1b4a3 e388a4556c0f65e1904146cc1a846bee<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

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

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

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

Cuba semula kod go

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

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam