Trait diesel::query_dsl::RunQueryDsl [−][src]
pub trait RunQueryDsl<Conn>: Sized { fn execute(self, conn: &Conn) -> QueryResult<usize>
where
Conn: Connection,
Self: ExecuteDsl<Conn>, { ... } fn load<U>(self, conn: &Conn) -> QueryResult<Vec<U>>
where
Self: LoadQuery<Conn, U>, { ... } fn get_result<U>(self, conn: &Conn) -> QueryResult<U>
where
Self: LoadQuery<Conn, U>, { ... } fn get_results<U>(self, conn: &Conn) -> QueryResult<Vec<U>>
where
Self: LoadQuery<Conn, U>, { ... } fn first<U>(self, conn: &Conn) -> QueryResult<U>
where
Self: LimitDsl,
Limit<Self>: LoadQuery<Conn, U>, { ... } }
Expand description
Methods used to execute queries.
Provided methods
fn execute(self, conn: &Conn) -> QueryResult<usize> where
Conn: Connection,
Self: ExecuteDsl<Conn>,
fn execute(self, conn: &Conn) -> QueryResult<usize> where
Conn: Connection,
Self: ExecuteDsl<Conn>,
Executes the given command, returning the number of rows affected.
execute
is usually used in conjunction with insert_into
,
update
and delete
where the number of
affected rows is often enough information.
When asking the database to return data from a query, load
should
probably be used instead.
Example
let inserted_rows = insert_into(users) .values(name.eq("Ruby")) .execute(&connection)?; assert_eq!(1, inserted_rows); let inserted_rows = insert_into(users) .values(&vec![name.eq("Jim"), name.eq("James")]) .execute(&connection)?; assert_eq!(2, inserted_rows);
Executes the given query, returning a Vec
with the returned rows.
When using the query builder,
the return type can be
a tuple of the values,
or a struct which implements Queryable
.
When this method is called on sql_query
,
the return type can only be a struct which implements QueryableByName
For insert, update, and delete operations where only a count of affected is needed,
execute
should be used instead.
Examples
Returning a single field
let data = users.select(name) .load::<String>(&connection)?; assert_eq!(vec!["Sean", "Tess"], data);
Returning a tuple
let data = users .load::<(i32, String)>(&connection)?; let expected_data = vec![ (1, String::from("Sean")), (2, String::from("Tess")), ]; assert_eq!(expected_data, data);
Returning a struct
#[derive(Queryable, PartialEq, Debug)] struct User { id: i32, name: String, } let data = users .load::<User>(&connection)?; let expected_data = vec![ User { id: 1, name: String::from("Sean"), }, User { id: 2, name: String::from("Tess"), }, ]; assert_eq!(expected_data, data);
fn get_result<U>(self, conn: &Conn) -> QueryResult<U> where
Self: LoadQuery<Conn, U>,
fn get_result<U>(self, conn: &Conn) -> QueryResult<U> where
Self: LoadQuery<Conn, U>,
Runs the command, and returns the affected row.
Err(NotFound)
will be returned if the query affected 0 rows. You can
call .optional()
on the result of this if the command was optional to
get back a Result<Option<U>>
When this method is called on an insert, update, or delete statement,
it will implicitly add a RETURNING *
to the query,
unless a returning clause was already specified.
Example
let inserted_row = insert_into(users) .values(name.eq("Ruby")) .get_result(&connection)?; assert_eq!((3, String::from("Ruby")), inserted_row); // This will return `NotFound`, as there is no user with ID 4 let update_result = update(users.find(4)) .set(name.eq("Jim")) .get_result::<(i32, String)>(&connection); assert_eq!(Err(diesel::NotFound), update_result);
fn get_results<U>(self, conn: &Conn) -> QueryResult<Vec<U>> where
Self: LoadQuery<Conn, U>,
fn get_results<U>(self, conn: &Conn) -> QueryResult<Vec<U>> where
Self: LoadQuery<Conn, U>,
Runs the command, returning an Vec
with the affected rows.
This method is an alias for load
, but with a name that makes more
sense for insert, update, and delete statements.
Attempts to load a single record.
This method is equivalent to .limit(1).get_result()
Returns Ok(record)
if found, and Err(NotFound)
if no results are
returned. If the query truly is optional, you can call .optional()
on
the result of this to get a Result<Option<U>>
.
Example:
diesel::insert_into(users) .values(&vec![name.eq("Sean"), name.eq("Pascal")]) .execute(&connection)?; let first_name = users.order(id).select(name).first(&connection); assert_eq!(Ok(String::from("Sean")), first_name); let not_found = users .filter(name.eq("Foo")) .first::<(i32, String)>(&connection); assert_eq!(Err(diesel::NotFound), not_found);