Go Academy · Leçon

Instructions préparées

Exécuter des requêtes paramétrées

Leçon 3 sur 413 étapes

Instructions préparées est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce qu'une instruction préparée

Une instruction préparée envoie le texte SQL à la base de données une fois pour qu'il soit analysé et planifié, puis l'exécute plusieurs fois avec des paramètres différents. Elle est plus rapide pour les requêtes répétées et protège mieux contre les injections.

Marqueurs de paramètre

Ne construisez jamais du SQL en concaténant des données fournies par l'utilisateur. Utilisez des marqueurs afin que le pilote envoie les valeurs séparément. PostgreSQL utilise $1, $2 ; MySQL et SQLite utilisent ?.

SELECT * FROM users WHERE age > $1 AND city = $2

Pourquoi cela bloque les injections

Comme les paramètres circulent séparément du texte SQL, la base de données les traite strictement comme des données, jamais comme du code. Une valeur malveillante comme " OR 1=1 devient une chaîne littérale et non du SQL exécutable.

db.Prepare

Prepare renvoie un *sql.Stmt associé au groupe de connexions. Vous appelez ensuite Exec ou Query sur l'instruction avec les arguments.

stmt, err := db.Prepare("INSERT INTO users(name, age) VALUES($1, $2)")
if err != nil {
    log.Fatal(err)
}
defer stmt.Close()

Exécuter l'instruction

Appelez stmt.Exec avec un argument pour chaque marqueur. Pour les insertions et les mises à jour, Exec renvoie un sql.Result contenant le nombre de lignes modifiées et le dernier identifiant inséré.

res, err := stmt.Exec("Ada", 36)
if err != nil {
    log.Fatal(err)
}
n, _ := res.RowsAffected()
fmt.Println("inserted", n)

Réutiliser dans une boucle

Le gain vient de la réutilisation : préparez une fois, puis exécutez plusieurs fois dans une boucle. La base de données réutilise son plan analysé à chaque appel.

for _, u := range users {
    if _, err := stmt.Exec(u.Name, u.Age); err != nil {
        log.Fatal(err)
    }
}

Préparation implicite

Transmettre directement des arguments à db.Query ou db.Exec utilise également les marqueurs de manière sûre ; le pilote peut effectuer la préparation en interne. Prepare explicite est surtout utile pour les exécutions répétées.

Une simulation exécutable de liaison des paramètres

Les requêtes préparées réelles nécessitent une base de données. Cet exemple exécutable simule la liaison sécurisée des paramètres pour montrer comment les valeurs restent séparées du texte de la requête.

package main

import "fmt"

func execPrepared(query string, args ...interface{}) string {
    return fmt.Sprintf("EXEC %q with args %v", query, args)
}

func main() {
    q := "INSERT INTO users(name, age) VALUES($1, $2)"
    people := [][2]interface{}{{"Ada", 36}, {"Lin", 41}}
    for _, p := range people {
        fmt.Println(execPrepared(q, p[0], p[1]))
    }
}

Variantes de contexte

Utilisez PrepareContext et stmt.ExecContext afin que les appels préparés respectent les délais d'expiration et l'annulation, comme le reste de database/sql.

Fermez toujours le Stmt

Un *sql.Stmt conserve des ressources sur la base de données. Différez stmt.Close() lorsque vous avez terminé. Les requêtes qui restent ouvertes peuvent épuiser les limites de requêtes préparées côté serveur.

Requêtes et mise en commun des connexions

Une requête préparée sur *sql.DB fonctionne avec les connexions mises en commun ; la bibliothèque la prépare à nouveau sur la connexion utilisée. Vous n'avez généralement pas à gérer cela vous-même.

Vérification rapide

Vérifiez vos connaissances sur les requêtes préparées.

Récapitulatif

Vous avez appris à utiliser les requêtes préparées :

  • Prepare analyse une fois, puis exécute de nombreuses fois
  • Les paramètres fictifs ($1 ou ?) gardent les valeurs sous forme de données et empêchent les injections
  • stmt.Exec renvoie le nombre de lignes affectées ; différez stmt.Close()
  • Réutilisez les requêtes dans les boucles ; utilisez les variantes de contexte pour les délais limites
Gratuit pour commencer

Apprends Go avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
51
Leçons
203

Questions Fréquemment Posées

La leçon « Instructions préparées » est-elle gratuite ?

Oui — le texte complet de « Instructions préparées » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Instructions préparées » ?

Exécuter des requêtes paramétrées Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Go Academy ?

Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Instructions préparées » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?

Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Ouvrir une connexion
  2. Interroger des lignes
  3. Instructions préparées
  4. Transactions
← Retour à Go Academy