Heim  >  Artikel  >  Backend-Entwicklung  >  Es kann keine Verbindung zur Postgres-Datenbank AWS RDS über pgx hergestellt werden

Es kann keine Verbindung zur Postgres-Datenbank AWS RDS über pgx hergestellt werden

王林
王林nach vorne
2024-02-14 14:03:071002Durchsuche

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

PHP-Editor Zimo ist auf ein Problem gestoßen, als er pgx zum Herstellen einer Verbindung zur Postgres-Datenbank AWS RDS verwendete. Er stellte fest, dass es ihm nicht gelang, eine Verbindung herzustellen, obwohl er sie gemäß den Anweisungen in der offiziellen Dokumentation und anderen Ressourcen konfiguriert hatte. Er versuchte verschiedene Methoden, darunter das Überprüfen von Datenbankberechtigungen, das Bestätigen von Netzwerkverbindungen, das Ändern von Konfigurationsdateien usw., aber das Problem bestand immer noch. Er hofft, eine wirksame Lösung für dieses Problem zu finden.

Frageninhalt

Ich habe versucht, in einem Go-Programm mit dem Paket github.com/jackc/pgx/v5 eine Verbindung zu einer Postgres-Datenbank in AWS RDS herzustellen, habe aber die folgende Fehlermeldung erhalten:

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

Auch wenn es ein Fehler ist, explizit anzugeben, dass die Datenbank nicht existiert, habe ich die RDS-Datenbank erstellt und kann mich auch über pgAdmin mit ihr verbinden. Aber wenn ich versuche, eine Verbindung im Go-Code herzustellen, erhalte ich die obige Fehlermeldung.

Ich habe die folgenden Punkte überprüft

  1. Sicherheitsgruppe lässt den gesamten Datenverkehr über Port 5432 zu
  2. Öffentlicher Zugriff in RDS aktiviert
  3. Möglichkeit, über pgAdmin eine Verbindung zur gleichen Datenbank herzustellen.
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()

Hier stimmt möglicherweise etwas nicht. Sogar von pgAdmin aus kann ich die Tabelle erstellen, aber keine Verbindung über meinen Go-Code herstellen.

Problemumgehung

Das Problem besteht darin, dass die Datenbank „golangpg“ auf Ihrem RDS-PostgreSQL-Host nicht vorhanden ist. 94b3e26ee717c64999d7867364b1b4a3 e388a4556c0f65e1904146cc1a846bee<code>RDS标识符!=数据库名称RDS-Kennung! =Datenbankname

Ich erstelle hier dein Setup nach:

PostgreSQL RDS

Den gleichen Code ausführen und den gleichen Fehler erhalten:

▶ 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

Der Grund ist: 数据库“golangdb”不存在Datenbank „golangdb“ existiert nicht existiert nicht in meinem PostgreSQL-RDS.

Stellen Sie eine Verbindung zum Datenbankhost her und listen Sie die verfügbaren Datenbanken auf.

▶ 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

Dies ist auch der Grund, warum die Verwendung von dbname := "postgres"dbname := "postgres" funktioniert, da die Datenbank auf dem Host-Computer vorhanden ist.

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

Neue Datenbank erstellen

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-Code erneut versuchen

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

Das obige ist der detaillierte Inhalt vonEs kann keine Verbindung zur Postgres-Datenbank AWS RDS über pgx hergestellt werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen