Introduction : Pourquoi Go et les bases de données forment un duo idéal
\nGo (Golang) est un langage compilé moderne créé par Google. Ses principaux atouts sont des performances élevées, la simplicité et un support intégré de la concurrence. En ce qui concerne le travail avec les bases de données, Go propose des bibliothèques standard puissantes et des pilotes tiers populaires pour tous les SGBD.
\nDans cet article, nous allons voir comment se connecter et effectuer des opérations de base avec deux des bases de données les plus populaires : la base relationnelle PostgreSQL et la base orientée documents MongoDB. Ce contenu est destiné aux développeurs débutants qui connaissent déjà les bases de la syntaxe Go.
\n\n1. Préparation de l'environnement et installation des pilotes
\nAvant d'écrire du code, assurez-vous que Go (version 1.21+) est installé. Pour travailler avec les bases de données, nous aurons besoin de pilotes. Installez-les à l'aide des commandes suivantes :
\ngo get github.com/lib/pq // pour PostgreSQL\ngo get go.mongodb.org/mongo-driver // pour MongoDB\nAssurez-vous également que les serveurs de bases de données correspondants sont en cours d'exécution sur votre machine (localement ou via Docker).
\n\n1.1. Structure du projet
\nCréez un fichier main.go. Toute la logique sera concentrée dans ce fichier pour simplifier. Dans des projets réels, il est préférable de séparer le code en paquets.
2. Travailler avec PostgreSQL en Go
\nPostgreSQL est un SGBD relationnel puissant. Pour l'utiliser en Go, nous utilisons le paquet database/sql et le pilote lib/pq.
2.1. Connexion à la base de données
\nCréons une fonction de connexion. La chaîne de connexion (DSN) contient l'hôte, le port, le nom d'utilisateur et la base de données.
\npackage main\n\nimport (\n "database/sql"\n "fmt"\n "log"\n\n _ "github.com/lib/pq"\n)\n\nfunc main() {\n connStr := "host=localhost port=5432 user=postgres password=secret dbname=testdb sslmode=disable"\n db, err := sql.Open("postgres", connStr)\n if err != nil {\n log.Fatal("Erreur de connexion :", err)\n }\n defer db.Close()\n\n // Vérifier la connexion\n err = db.Ping()\n if err != nil {\n log.Fatal("Impossible d'établir la connexion :", err)\n }\n fmt.Println("Connecté avec succès à PostgreSQL !")\n}\nImportant : sql.Open ne crée pas une connexion réelle, seulement un pool. La connexion réelle a lieu lors de la première requête ou de l'appel à Ping().
2.2. Création d'une table et insertion de données
\nCréons maintenant une table users et ajoutons quelques enregistrements.
// Création de la table\ncreateTable := `\nCREATE TABLE IF NOT EXISTS users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(100) NOT NULL,\n email VARCHAR(100) UNIQUE NOT NULL,\n age INT\n);`\n_, err = db.Exec(createTable)\nif err != nil {\n log.Fatal("Erreur lors de la création de la table :", err)\n}\n\n// Insertion de données\ninsert := `INSERT INTO users (name, email, age) VALUES ($1, $2, $3)`\n_, err = db.Exec(insert, "Ivan Petrov", "ivan@example.com", 30)\nif err != nil {\n log.Fatal("Erreur lors de l'insertion :", err)\n}\nfmt.Println("Données ajoutées")\nNotez l'utilisation des placeholders $1, $2 — cela protège contre les injections SQL.
2.3. Lecture et mise à jour des données
\nEffectuons une requête de sélection et mettons à jour l'âge de l'utilisateur.
\n// Lecture des données\nrows, err := db.Query("SELECT id, name, email, age FROM users")\nif err != nil {\n log.Fatal(err)\n}\ndefer rows.Close()\n\nfor rows.Next() {\n var id int\n var name, email string\n var age int\n err := rows.Scan(&id, &name, &email, &age)\n if err != nil {\n log.Fatal(err)\n }\n fmt.Printf("ID : %d, Nom : %s, Email : %s, Âge : %d\\n", id, name, email, age)\n}\n\n// Mise à jour\n_, err = db.Exec("UPDATE users SET age = $1 WHERE name = $2", 31, "Ivan Petrov")\nif err != nil {\n log.Fatal(err)\n}\nfmt.Println("Âge mis à jour")\n\n