Согласно документации 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;
|