Consultas Parametrizadas
En esta página
Siempre que un valor externo (entrada del usuario, variable del programa) deba
aparecer en una query, usa parámetros posicionales en vez de concatenación de
cadenas. Cada ? en el SQL es reemplazado, en orden, por el elemento
correspondiente del array de bindings pasado como segundo argumento a execute
o query.
Esto tiene dos ventajas: protege contra SQL injection y permite que el driver reutilice el plan de ejecución de la query en llamadas repetidas.
Inserta usuarios con ? y filtra por edad mínima — los valores nunca tocan el
texto SQL.
// Feature: Database — parameterized queries (`?` + bindings array)
// Syntax: `db.query(sql, [v1, v2, ...])` and `db.execute(sql, [...])`
// When to use: ALWAYS when SQL receives external values. Prevents SQL
// injection and lets the driver cache the query plan.
use std::database::Database
let db = Database.open("sqlite://:memory:").unwrap()
defer db.close()
db.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)").unwrap()
// `?` in order; the bind array fills it in.
db.execute("INSERT INTO users (id, name, age) VALUES (?, ?, ?)", [1, "Ana", 30]).unwrap()
db.execute("INSERT INTO users (id, name, age) VALUES (?, ?, ?)", [2, "Bruno", 25]).unwrap()
db.execute("INSERT INTO users (id, name, age) VALUES (?, ?, ?)", [3, "Carla", 40]).unwrap()
const min_age = 28
let rows = db.query("SELECT name, age FROM users WHERE age >= ? ORDER BY age", [min_age]).unwrap()
print("users aged {min_age}+:")
for row in rows {
print(" {row.name} ({row.age})")
}
// expected:
// users aged 28+:
// Ana (30)
// Carla (40)
Requiere la CLI o el host de Zolo; ábrelo en el playground o ejecútalo localmente.
Desafío
Añade un cuarto usuario mediante parámetros y filtra por nombre usando
WHERE name = ?. ¿Qué pasa si pasas nil como valor?
Consulta también