Consultas Parametrizadas
Nesta página
Sempre que um valor externo (entrada do usuário, variável de programa) precisar
entrar numa query, use parâmetros posicionais em vez de concatenação de
strings. Cada ? no SQL é substituído, em ordem, pelo elemento correspondente
do array de bindings passado como segundo argumento de execute ou query.
Isso tem dois benefícios: protege contra SQL injection e permite que o driver reutilize o plano de execução da query em chamadas repetidas.
Insere usuários com ? e filtra por idade mínima — os valores nunca tocam o
texto SQL.
04-parameterized.zolo
// 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)
Requer a CLI/host do Zolo — abra no playground ou rode localmente.
Desafio
Acrescente um quarto usuário via parâmetros e filtre pelo nome usando
WHERE name = ?. O que acontece se você passar nil como valor?