Выборка нескольких строк в Rust
Запрос выборки возвращает набор строк. Его сначала готовят, затем обходят результат и для каждой строки собирают поля в структуру или отдельные переменные.
Опишем строку таблицы и выведем имена:
use rusqlite::Connection;
struct User {
id: i64,
name: String,
}
fn list_users() -> Result<(), rusqlite::Error> {
let conn = Connection::open("app.db")?;
let mut stmt = conn.prepare("SELECT id, name FROM user")?;
let rows = stmt.query_map([], |row| {
Ok(User {
id: row.get(0)?,
name: row.get(1)?,
})
})?;
for item in rows {
let user = item?;
println!("{}", user.name);
}
Ok(())
}
fn main() {
match list_users() {
Ok(()) => {}
Err(e) => println!("{}", e),
}
}
На экране по одной строке на каждую запись таблицы, порядок совпадает с порядком строк в файле.
Тот же обход можно сделать с печатью и ключа, и имени:
use rusqlite::Connection;
fn print_pairs() -> Result<(), rusqlite::Error> {
let conn = Connection::open("app.db")?;
let mut stmt = conn.prepare("SELECT id, name FROM user")?;
let rows = stmt.query_map([], |row| {
let id: i64 = row.get(0)?;
let name: String = row.get(1)?;
Ok((id, name))
})?;
for item in rows {
let (id, name) = item?;
println!("{} {}", id, name);
}
Ok(())
}
fn main() {
if let Err(e) = print_pairs() {
println!("{}", e);
}
}
Дана таблица:
1 ann
2 bob
Выведите все имена по одному на строку
в порядке возрастания id.
Дана таблица user с полями
id и name. Запишите
структуру User и обход, который
печатает только id каждой строки.
Скажите, зачем запрос выборки сначала готовят, а потом обходят строки результата.