Maison > développement back-end > Golang > le corps du texte

Impossible de se connecter à la base de données Postgres AWS RDS à l'aide de pgx

王林
Libérer: 2024-02-14 14:03:07
avant
1048 Les gens l'ont consulté

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

L'éditeur PHP Zimo a rencontré un problème lors de l'utilisation de pgx pour se connecter à la base de données Postgres AWS RDS. Il a constaté qu'il ne parvenait pas à établir une connexion, même s'il l'avait configurée conformément aux instructions fournies par la documentation officielle et d'autres ressources. Il a essayé diverses méthodes, notamment la vérification des autorisations de la base de données, la confirmation des connexions réseau, la modification des fichiers de configuration, etc., mais le problème persistait. Il espère trouver une solution efficace à ce problème.

Contenu de la question

J'ai essayé de me connecter à une base de données postgres dans AWS RDS dans un programme Go à l'aide du package github.com/jackc/pgx/v5, mais j'ai eu l'erreur suivante :

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
Copier après la connexion

Même si c'est une erreur d'indiquer explicitement que la base de données n'existe pas, j'ai créé la base de données RDS et je peux également m'y connecter via pgAdmin. Mais lorsque j'essaie de me connecter en code Go, j'obtiens l'erreur ci-dessus.

J'ai vérifié les points suivants

  1. Le groupe de sécurité autorise tout le trafic via le port 5432
  2. Accès public activé dans RDS
  3. Possibilité de se connecter à la même base de données via 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()
Copier après la connexion

Il y a peut-être quelque chose qui ne va pas ici. Même depuis pgAdmin, je peux créer la table mais je ne peux pas me connecter depuis mon code Go.

Solution de contournement

Le problème est dû au fait que la base de données "golangpg" n'existe pas dans votre hôte RDS PostgreSQL. </p> <p><code>RDS标识符!=数据库名称Identifiant RDS ! =Nom de la base de données

<小时/>

Je recrée votre configuration ici :

PostgreSQL RDS

Exécuter le même code et obtenir la même erreur :

▶ 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
Copier après la connexion

La raison est que 数据库“golangdb”不存在La base de données "golangdb" n'existe pas n'existe pas dans mon RDS PostgreSQL.

Connectez-vous à l'hôte de la base de données et répertoriez les bases de données disponibles.

▶ 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
Copier après la connexion

C'est aussi pourquoi l'utilisation de dbname := "postgres"dbname := "postgres" fonctionne, puisque la base de données existe sur la machine hôte.

▶ go run main.go
Database connection establised to db  postgres
Copier après la connexion

Créer une nouvelle base de données

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
Copier après la connexion

Réessayez le code

▶ go run main.go
Database connection establised to db  golangdb
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal