Maison  >  Article  >  développement back-end  >  Impossible de se connecter à la base de données Postgres AWS RDS à l'aide de pgx

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

王林
王林avant
2024-02-14 14:03:071044parcourir

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

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

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

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

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

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

Réessayez le code

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer