pub struct Rows<'stmt> {
// some fields omitted
}
An iterator over the resulting rows of a query.
Due to the way SQLite returns result rows of a query, it is not safe to attempt to get values
from a row after it has become stale (i.e., next()
has been called again on the Rows
iterator). For example:
fn bad_function_will_panic(conn: &Connection) -> Result<i64> {
let mut stmt = try!(conn.prepare("SELECT id FROM my_table"));
let mut rows = try!(stmt.query(&[]));
let row0 = try!(rows.next().unwrap());
let row1 = try!(rows.next().unwrap());
let my_id = row0.get(0);
Ok(my_id)
}
Please note that this means some of the methods on Iterator
are not useful, such as collect
(which would result in a collection of rows, only the last of which can safely be used) and
min
/max
(which could return a stale row unless the last row happened to be the min or max,
respectively).
This problem could be solved by changing the signature of next
to tie the lifetime of the
returned row to the lifetime of (a mutable reference to) the result rows handle, but this would
no longer implement Iterator
, and therefore you would lose access to the majority of
functions which are useful (such as support for for ... in ...
looping, map
, filter
,
etc.).
Trait Implementations
type Item = Result<Row<'stmt>>
1.0.0fn map<B, F>(self, f: F) -> Map<Self, F> where F: FnMut(Self::Item) -> B
1.0.0fn filter<P>(self, predicate: P) -> Filter<Self, P> where P: FnMut(&Self::Item) -> bool
1.0.0fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P> where P: FnMut(&Self::Item) -> bool
1.0.0fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P> where P: FnMut(&Self::Item) -> bool
1.0.0fn skip(self, n: usize) -> Skip<Self>
1.0.0fn take(self, n: usize) -> Take<Self>
1.0.0fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F> where F: FnMut(&mut St, Self::Item) -> Option<B>
1.0.0fn fuse(self) -> Fuse<Self>
1.0.0fn inspect<F>(self, f: F) -> Inspect<Self, F> where F: FnMut(&Self::Item) -> ()
1.0.0fn by_ref(&mut self) -> &mut Self
1.0.0fn fold<B, F>(self, init: B, f: F) -> B where F: FnMut(B, Self::Item) -> B
1.0.0fn all<F>(&mut self, f: F) -> bool where F: FnMut(Self::Item) -> bool
1.0.0fn any<F>(&mut self, f: F) -> bool where F: FnMut(Self::Item) -> bool
1.0.0fn find<P>(&mut self, predicate: P) -> Option<Self::Item> where P: FnMut(&Self::Item) -> bool
1.0.0fn max(self) -> Option<Self::Item> where Self::Item: Ord
1.0.0fn min(self) -> Option<Self::Item> where Self::Item: Ord
fn max_by<B, F>(self, f: F) -> Option<Self::Item> where B: Ord, F: FnMut(&Self::Item) -> B
1.6.0fn max_by_key<B, F>(self, f: F) -> Option<Self::Item> where F: FnMut(&Self::Item) -> B, B: Ord
fn min_by<B, F>(self, f: F) -> Option<Self::Item> where B: Ord, F: FnMut(&Self::Item) -> B
1.6.0fn min_by_key<B, F>(self, f: F) -> Option<Self::Item> where F: FnMut(&Self::Item) -> B, B: Ord
1.0.0fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB) where FromB: Default + Extend<B>, FromA: Default + Extend<A>, Self: Iterator<Item=(A, B)>
1.0.0fn cloned<'a, T>(self) -> Cloned<Self> where Self: Iterator<Item=&'a T>, T: 'a + Clone
1.0.0fn cycle(self) -> Cycle<Self> where Self: Clone
fn sum<S>(self) -> S where S: Add<Self::Item, Output=S> + Zero
fn product<P>(self) -> P where P: Mul<Self::Item, Output=P> + One