pgx pour Go : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction à pgx : un driver PostgreSQL puissant pour Go

La bibliothèque pgx (PostgreSQL eXtended) est un driver moderne et haute performance, ainsi qu'un ensemble d'outils pour interagir avec PostgreSQL depuis le langage de programmation Go. Contrairement au package standard database/sql, pgx offre un accès direct au protocole PostgreSQL, ce qui permet un gain de performance significatif et l'accès à des fonctionnalités uniques du SGBD telles que LISTEN/NOTIFY, le protocole COPY, la gestion des tableaux et des types composites, et bien plus encore.

Pourquoi utiliser pgx plutôt que le database/sql standard ? Premièrement, pgx est 30 à 50 % plus rapide grâce à l'absence d'abstractions superflues. Deuxièmement, il prend en charge toutes les fonctionnalités modernes de PostgreSQL 12+ (et versions ultérieures). Troisièmement, pgx fournit une API riche pour la gestion des connexions, des pools de connexions, des requêtes préparées et des transactions. Enfin, pgx est entièrement compatible avec database/sql via un adaptateur dédié, ce qui permet de l'utiliser dans des projets utilisant déjà l'interface standard.

Installation de pgx

L'installation de pgx dans un projet Go s'effectue avec la commande standard go get. Pour travailler avec PostgreSQL, vous devrez installer le package principal pgx et éventuellement des modules supplémentaires :

# Installation du package principal pgx v5 (version recommandée)
go get github.com/jackc/pgx/v5

# Installation du package pour la gestion du pool de connexions
go get github.com/jackc/pgx/v5/pgxpool

# Installation de l'adaptateur pour la compatibilité avec database/sql
go get github.com/jackc/pgx/v5/stdlib

Après avoir exécuté ces commandes, vous pourrez importer pgx dans vos fichiers Go. Assurez-vous d'avoir installé Go version 1.18 ou supérieure, car pgx v5 utilise les génériques.

Démarrage rapide : première connexion à PostgreSQL

Écrivons un programme simple qui se connecte à une base de données PostgreSQL et exécute une requête. Supposons que PostgreSQL soit lancé sur localhost:5432, que la base de données s'appelle testdb, l'utilisateur testuser avec le mot de passe testpass.

package main

import (
    "context"
    "fmt"
    "log"
    "os"

    "github.com/jackc/pgx/v5"
)

func main() {
    // Chaîne de connexion
    connStr := "postgres://testuser:testpass@localhost:5432/testdb"

    // Établir la connexion
    conn, err := pgx.Connect(context.Background(), connStr)
    if err != nil {
        log.Fatalf("Impossible de se connecter à la base de données : %v", err)
    }
    defer conn.Close(context.Background())

    // Exécuter une requête simple
    var greeting string
    err = conn.QueryRow(context.Background(), "SELECT 'Bonjour, PostgreSQL!'").Scan(&greeting)
    if err != nil {
        log.Fatalf("Erreur lors de l'exécution de la requête : %v", err)
    }

    fmt.Println(greeting)
}

Ce code établit une connexion, exécute une requête et affiche le résultat. Notez l'utilisation de context.Background() — c'est la méthode standard pour passer un contexte en Go, permettant de contrôler les timeouts et l'annulation des opérations.

Méthodes et fonctions principales de pgx

Examinons les méthodes et fonctions les plus importantes de la bibliothèque pgx. Pour chaque méthode, nous fournissons une description, les paramètres et un exemple de code fonctionnel.

1. pgx.Connect — établir une connexion

Fonction : Crée une nouvelle connexion à PostgreSQL. C'est la méthode principale pour commencer à travailler avec la base de données.

Paramètres :

  • ctx context.Context — contexte pour gérer la durée de vie de la connexion
  • connString string — chaîne de connexion au format URI ou DSN

Retourne : (*pgx.Conn, error)

Exemple :

conn, err := pgx.Connect(context.Background(), "postgres://user:pass@localhost:5432/mydb")
if err != nil {
    log.Fatal(err)
}
defer conn.Close(context.Background())

2. c

Recommendations