Tiberius simple_query согласно документации во время компиляции - PullRequest
0 голосов
/ 01 мая 2019

Согласно документации Tiberius , использование функции SQLConnection::simple_query() так же просто, как:

extern crate futures;
extern crate futures_state_stream;
extern crate tokio;
extern crate tiberius;
use futures::Future;
use futures_state_stream::StateStream;
use tokio::executor::current_thread;
use tiberius::SqlConnection;

fn main() {

   // 1: for windows we demonstrate the hardcoded variant
   // which is equivalent to:
   //     let conn_str = "server=tcp:localhost,1433;integratedSecurity=true;";
   //     let future = SqlConnection::connect(conn_str).and_then(|conn| {
   // and for linux we use the connection string from an environment variable
   let conn_str = if cfg!(windows) {
       "server=tcp:localhost,1433;integratedSecurity=true;".to_owned()
   } else {
       ::std::env::var("TIBERIUS_TEST_CONNECTION_STRING").unwrap()
   };

   let future = SqlConnection::connect(conn_str.as_str())
       .and_then(|conn| {
           conn.simple_query("SELECT 1+2").for_each(|row| {
               let val: i32 = row.get(0);
               assert_eq!(val, 3i32);
               Ok(())
           })
       })
       .and_then(|conn| conn.simple_exec("create table #Temp(gg int);"))
       .and_then(|(_, conn)| conn.simple_exec("UPDATE #Temp SET gg=1 WHERE gg=1"));

   current_thread::block_on_all(future).unwrap();
}

Однако я использую tiberius crate версии 0.3.2 следующим образом и получаю ошибку во время компиляции. Я не могу сказать, что я делаю неправильно, потому что тип QueryResult не указывает, в какую оболочку мне нужно обернуть значение (нет документации, написанной вручную, или примеров в документации QueryResult, только автоматически сгенерированный API документы, которые довольно загадочны для нового программиста Rust! :()

Я привык обрабатывать StdResult с и Option с такими вещами, как Ok() и Err() и Some(), и я чувствую, что мне нужно сделать что-то вроде Ok(rslt) в строке 7 ниже , но это также дает мне ошибку во время компиляции.

  • Вопрос 1. Правильно ли оформлена документация? Если мой код не скомпилируется, я думаю, что код документации тоже не будет ... если только я не использую неправильную версию Rust (использую стабильную версию) или если документы Tiberius верны только для более старой версии Tiberius .
  • Вопрос 2: Как исправить ошибку во время компиляции и сделать что-то эквивалентное примеру doc? Я просто хочу выполнить один тривиальный запрос и вернуть обработанные результаты в строку.
fn get_users() -> String {
    let conn_str : &str = &::std::env::var("SQLCONN").expect("Could not obtain SQLCONN");
    let mut output = String::new();
    let first : bool = true;
    let future = SqlConnection::connect(conn_str)
    .and_then(|conn| {
        if let rslt = conn.simple_query("SELECT \"A\", \"B\"") {
            rslt.for_each(|row| {
                let account : &str = row.get(0);
                let charName : &str = row.get(1);
                if first == false {
                    output.push_str("\r\n");
                }
                output.push_str(account);
                output.push_str(" is logged in as ");
                output.push_str(charName);
                first = false;
                Ok(())
            })
        }
    });
    block_on_all(future).unwrap();
    output
}

Ошибка вывода:

error[E0599]: no method named `for_each` found for type `tiberius::stmt::QueryResult<tiberius::query::ResultSetStream<std::boxed::Box<dyn tiberius::BoxableIo>, tiberius::query::QueryStream<std::boxed::Box<dyn tiberius::BoxableIo>>>>` in the current scope
   --> src\main.rs:104:18
    |
104 |             rslt.for_each(|row| {
    |                  ^^^^^^^^
    |
    = note: the method `for_each` exists but the following trait bounds were not satisfied:
            `&mut tiberius::stmt::QueryResult<tiberius::query::ResultSetStream<std::boxed::Box<dyn tiberius::BoxableIo>, tiberius::query::QueryStream<std::boxed::Box<dyn tiberius::BoxableIo>>>> : futures_state_stream::StateStream`
            `&mut tiberius::stmt::QueryResult<tiberius::query::ResultSetStream<std::boxed::Box<dyn tiberius::BoxableIo>, tiberius::query::QueryStream<std::boxed::Box<dyn tiberius::BoxableIo>>>> : std::iter::Iterator`
    = help: items from traits can only be used if the trait is in scope
help: the following trait is implemented but not in scope, perhaps add a `use` for it:
    |
2   | use futures_state_stream::StateStream;
    |

1 Ответ

0 голосов
/ 01 мая 2019

Похоже, что в futures_state_stream произошли серьезные изменения, и я использовал для этого пакета версию слишком новую , что привело к поломке.

Мне пришлось понизить версию futures_state_stream до 0.1.0 до эта проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...