29 · Banco de Dados
Consultas Parametrizadas
Usar ? + array de bindings para passar valores externos com segurança.
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.
// 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?