Как использовать метод Row :: get rusqlite для типа, который я не знаю во время компиляции? - PullRequest
0 голосов
/ 25 февраля 2020

Я использую rusqlite ящик Rust для вставки и вызова данных из базы данных sqlite.

Я использую метод get() для его Row, который возвращает Result<T>. У меня есть текущий фрагмент кода:

while let Some(row) = rows.next()? {
    let value = match row.get(0).expect("Could not get value from database cell.") {
      // Do something here to specify types and return them or add them to a separate collection
   };
}

Как я могу указать тип? В настоящее время единственный способ, которым я могу правильно развернуть функцию get, это присвоить ее переменной с уже заданным типом c, например let value: i64 = row.get(0).unwrap(), но я не знаю, как отличить, было ли на самом деле get(0) строка или логическое значение или любой другой допустимый тип SQL.

Я искал другие примеры match с Result, но их совпадения основаны на значениях, а не на типах.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Как я могу указать тип? В настоящее время единственный способ, которым я могу правильно развернуть функцию get, это присвоить ее переменной с уже указанным типом c, например let value: i64 = row.get(0).unwrap()

Если я правильно понимаю, что вы хотите, вы ' ищите get_raw и get_raw_checked, которые возвращают a ValueRef enum таким образом, вы можете проверить во время выполнения, какой тип полученного значения:

while let Some(row) = rows.next()? {
   let value = match row.get_raw(0) {
         ValueRef::Null => ...
         ValueRef::Integer(i) => ...
         ValueRef::Real(f) => ...
         ValueRef::Text(t) => ...
         ValueRef::Blob(b) => ...
   }
}

get указывает на ожидание и возвращает Err, если ожидание предано, потому что обычно вы знаете, какой тип значения, хранящегося в столбце , должен быть , и если кто-то пошел под вами и заменил тип столбца или значения, то все сломано. Он также удобно обрабатывает различные преобразования , поэтому вам не нужно обрабатывать их вручную.

Кстати, если вы не хотите обрабатывать возможную ошибку из get, вы можете просто использовать его брат get_unwrap.

1 голос
/ 25 февраля 2020

T на вашем Result<T> исходит из схемы таблиц, поэтому тип T будет уже определяться базой данных, а не Rust.

Обычно хорошей практикой является создайте struct, который сопоставляет вашу таблицу SQL, как в примере в документации .

сторона SQLite

CREATE TABLE person (
    id              INTEGER PRIMARY KEY,
    name            TEXT NOT NULL,
    time_created    TEXT NOT NULL,
    data            BLOB
)

сторона ржавчины

#[derive(Debug)]
struct Person {
    id: i32,
    name: String,
    time_created: Timespec,
    data: Option<Vec<u8>>,
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...