0Pricing
Go Academy · Lezione

Istruzioni preparate

Eseguire query parametrizzate

Istruzioni preparate è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.

Che cos'è un prepared statement

Un prepared statement invia una volta il testo SQL al database affinché venga analizzato e pianificato, quindi lo esegue molte volte con parametri diversi. È più veloce per le query ripetute e più sicuro contro le injection.

Segnaposto dei parametri

Non costruisca mai l'SQL concatenando l'input dell'utente. Utilizzi i segnaposto, così il driver invia i valori separatamente. PostgreSQL usa $1, $2; MySQL e SQLite usano ?.

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

Perché questo blocca l'injection

Poiché i parametri viaggiano separatamente dal testo SQL, il database li tratta rigorosamente come dati, mai come codice. Un valore malevolo come " OR 1=1 diventa una stringa letterale, non SQL eseguibile.

db.Prepare

Prepare restituisce un *sql.Stmt associato al pool. È quindi possibile chiamare Exec o Query sull'istruzione passando gli argomenti.

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

Eseguire l'istruzione

Chiami stmt.Exec con un argomento per ogni segnaposto. Per gli inserimenti e gli aggiornamenti, Exec restituisce un sql.Result con il numero di righe interessate e l'ID dell'ultimo inserimento.

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

Riutilizzare in un ciclo

Il vantaggio deriva dal riutilizzo: prepari una volta ed esegua molte volte all'interno di un ciclo. Il database riutilizza il piano analizzato per ogni chiamata.

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

Preparazione implicita

Passare direttamente gli argomenti a db.Query o db.Exec utilizza comunque i segnaposto in modo sicuro; il driver può eseguire la preparazione internamente. Prepare esplicito è utile soprattutto per le esecuzioni ripetute.

Una simulazione eseguibile del binding dei parametri

Le prepared statement reali richiedono un database. Questo esempio eseguibile simula il binding sicuro dei parametri per mostrare come i valori restino separati dal testo della query.

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]))
    }
}

Varianti con il contesto

Utilizzi PrepareContext e stmt.ExecContext affinché le chiamate alle prepared statement rispettino timeout e annullamento, proprio come il resto di database/sql.

Chiuda sempre lo Stmt

Un *sql.Stmt occupa risorse nel database. Rimandi stmt.Close() quando ha terminato. La mancata chiusura delle statement può esaurire i limiti delle prepared statement lato server.

Statement e pooling

Una statement preparata su *sql.DB funziona tra le connessioni del pool; la libreria la prepara nuovamente sulla connessione su cui viene eseguita. Di solito non deve gestire questo processo personalmente.

Verifica rapida

Verifichi le Sue conoscenze sulle prepared statement.

Riepilogo

Ha imparato a usare le prepared statement:

  • Prepare analizza una volta ed esegue molte volte
  • I segnaposto ($1 o ?) mantengono i valori come dati, impedendo le injection
  • stmt.Exec restituisce il numero di righe interessate; rimandi stmt.Close()
  • Riutilizzi le statement nei cicli; usi le varianti con Context per le scadenze

Domande Frequenti

La lezione «Istruzioni preparate» è gratuita?

Sì — il testo completo di «Istruzioni preparate» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.

Cosa imparerò in «Istruzioni preparate»?

Eseguire query parametrizzate Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Go Academy?

Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Istruzioni preparate»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Go Academy?

Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Aprire una connessione
  2. Eseguire query sulle righe
  3. Istruzioni preparate
  4. Transazioni
← Torna a Go Academy