Pular para o conteúdo

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
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)

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?

Buscar no Zolo

9 resultados

enespt-br