Я пытаюсь получить содержимое разных столбцов подряд. Поля базы данных — это поля TEXT, которые допускают значения NULL, однако мой код, как показано ниже, выдает следующую ошибку:
Finished dev [unoptimized + debuginfo] target(s) in 1.25s
thread 'main' panicked at src\test_db.rs:7:36:
called `Result::unwrap()` on an `Err` value: InvalidColumnType(0, "name", Null)
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
// Open connection
let conn = Connection::open(":memory:").unwrap();
// Create test_table
conn.execute(
"CREATE TABLE IF NOT EXISTS test_table (
id INTEGER PRIMARY KEY,
name TEXT
)", (),
).unwrap();
// Insert demo row
conn.execute("INSERT INTO test_table (id) VALUES (?1)", [1]).unwrap();
// Prepare an empty vector to store column data even if is empty string
let mut result: Vec<String> = Vec::new();
// The actual query
conn.query_row("SELECT name FROM test_table WHERE id = ?1", [1], |row| {
Ok({
result.push(row.get(0).unwrap());
})
}).unwrap();
Я думал об использовании методов while + match Ok() Err() для row.get(), но, видимо, rusqlite не имеет API для получения len() или цикла функции .get(). Есть идеи, как эту проблему можно решить и реализовать?





Правильный тип необязательных данных (данные, которые могут быть null) — Option<T>, и это работает:
// Prepare an empty vector to store column data even if is empty string
let mut result: Vec<Option<String>> = Vec::new();
// The actual query
conn.query_row("SELECT name FROM test_table WHERE id = ?1", [1], |row| {
result.push(row.get(0)?);
Ok(())
})
.unwrap();
Можете ли вы попробовать:
result.push(row.get::<_, Option<String>>(0).unwrap().unwrap_or(String::new()))? (то же самое для всех 5 столбцов)