Как вернуть данные столбца в RusQlite, даже если они равны нулю или пусты?

Я пытаюсь получить содержимое разных столбцов подряд. Поля базы данных — это поля 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(). Есть идеи, как эту проблему можно решить и реализовать?

Можете ли вы попробовать: result.push(row.get::<_, Option<String>>(0).unwrap().unwrap_or(String::new()))? (то же самое для всех 5 столбцов)

Dogbert 10.06.2024 11:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Правильный тип необязательных данных (данные, которые могут быть 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();

Детская площадка

Другие вопросы по теме