Saltar al contenido

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.

04-parameterized.zolo
Playground
// 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?

Buscar en Zolo

9 resultados

enespt-br