0Pricing
Go Academy · Lección

Sentencias preparadas

Ejecute consultas parametrizadas

Sentencias preparadas es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

Qué es una sentencia preparada

Una sentencia preparada envía el texto SQL a la base de datos una vez para analizarlo y elaborar su plan, y después la ejecuta muchas veces con distintos parámetros. Es más rápida para consultas repetidas y más segura frente a la inyección.

Marcadores de parámetros

No construya nunca SQL concatenando datos proporcionados por el usuario. Use marcadores para que el driver envíe los valores por separado. PostgreSQL usa $1, $2; MySQL y SQLite usan ?.

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

Por qué esto evita la inyección

Como los parámetros viajan separados del texto SQL, la base de datos los trata estrictamente como datos, nunca como código. Un valor malicioso como " OR 1=1 se convierte en una cadena literal, no en SQL ejecutable.

db.Prepare

Prepare devuelve un *sql.Stmt asociado al pool. Después puede llamar a Exec o Query sobre la sentencia pasando argumentos.

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

Ejecutar la sentencia

Llame a stmt.Exec con un argumento por cada marcador. Para inserciones y actualizaciones, Exec devuelve un sql.Result con el número de filas afectadas y el último ID insertado.

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

Reutilizar en un bucle

La ventaja está en la reutilización: prepare una vez y ejecute muchas veces dentro de un bucle. La base de datos reutiliza su plan analizado en cada llamada.

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

Preparación implícita

Pasar argumentos directamente a db.Query o db.Exec también utiliza marcadores de forma segura; el driver puede preparar la consulta internamente. Prepare explícitamente principalmente cuando vaya a ejecutar la consulta repetidamente.

Una simulación ejecutable de vinculación de parámetros

Las consultas preparadas reales necesitan una base de datos. Este ejemplo ejecutable simula la vinculación segura de parámetros para mostrar cómo los valores permanecen separados del texto de la consulta.

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 contexto

Use PrepareContext y stmt.ExecContext para que las llamadas preparadas respeten los tiempos de espera y la cancelación, igual que el resto de database/sql.

Cierre siempre el Stmt

Un *sql.Stmt mantiene recursos en la base de datos. Difiera stmt.Close() cuando haya terminado. Las sentencias que quedan abiertas pueden agotar los límites de sentencias preparadas del servidor.

Sentencias y pooling

Una sentencia preparada en *sql.DB funciona en todas las conexiones del pool; la biblioteca la prepara de nuevo en la conexión en la que termine. Normalmente no necesita gestionar esto por su cuenta.

Comprobación rápida

Ponga a prueba sus conocimientos sobre sentencias preparadas.

Resumen

Ha aprendido sobre las sentencias preparadas:

  • Prepare analiza una vez y ejecuta muchas veces
  • Los marcadores de posición ($1 o ?) mantienen los valores como datos y detienen la inyección
  • stmt.Exec devuelve las filas afectadas; difiera stmt.Close()
  • Reutilícelas en bucles; use las variantes de Context para establecer plazos

Preguntas frecuentes

¿La lección «Sentencias preparadas» es gratis?

Sí — el texto completo de «Sentencias preparadas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Sentencias preparadas»?

Ejecute consultas parametrizadas Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Sentencias preparadas»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Apertura de una conexión
  2. Consulta de filas
  3. Sentencias preparadas
  4. Transacciones
← Volver a Go Academy