pub struct Select<E>where
E: EntityTrait,{ /* private fields */ }
Expand description
Defines a structure to perform select operations
Implementations§
source§impl<E> Select<E>where
E: EntityTrait,
impl<E> Select<E>where
E: EntityTrait,
sourcepub fn from_raw_sql(self, stmt: Statement) -> SelectorRaw<SelectModel<E::Model>>
pub fn from_raw_sql(self, stmt: Statement) -> SelectorRaw<SelectModel<E::Model>>
Perform a Select operation on a Model using a Statement
sourcepub fn into_model<M>(self) -> Selector<SelectModel<M>>where
M: FromQueryResult,
pub fn into_model<M>(self) -> Selector<SelectModel<M>>where
M: FromQueryResult,
Return a Selector from Self
that wraps a SelectModel
Examples found in repository?
More examples
src/executor/select.rs (line 261)
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
pub async fn one<'a, C>(self, db: &C) -> Result<Option<E::Model>, DbErr>
where
C: ConnectionTrait,
{
self.into_model().one(db).await
}
/// Get all Models from the SELECT query
pub async fn all<'a, C>(self, db: &C) -> Result<Vec<E::Model>, DbErr>
where
C: ConnectionTrait,
{
self.into_model().all(db).await
}
/// Stream the results of a SELECT operation on a Model
pub async fn stream<'a: 'b, 'b, C>(
self,
db: &'a C,
) -> Result<impl Stream<Item = Result<E::Model, DbErr>> + 'b + Send, DbErr>
where
C: ConnectionTrait + StreamTrait + Send,
{
self.into_model().stream(db).await
}
sourcepub fn into_json(self) -> Selector<SelectModel<JsonValue>>
pub fn into_json(self) -> Selector<SelectModel<JsonValue>>
Get a selectable Model as a JsonValue for SQL JSON operations
sourcepub fn into_values<T, C>(self) -> Selector<SelectGetableValue<T, C>>where
T: TryGetableMany,
C: IntoEnumIterator + Iden,
pub fn into_values<T, C>(self) -> Selector<SelectGetableValue<T, C>>where
T: TryGetableMany,
C: IntoEnumIterator + Iden,
use sea_orm::{entity::*, query::*, tests_cfg::cake, DeriveColumn, EnumIter};
#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)]
enum QueryAs {
CakeName,
}
let res: Vec<String> = cake::Entity::find()
.select_only()
.column_as(cake::Column::Name, QueryAs::CakeName)
.into_values::<_, QueryAs>()
.all(&db)
.await?;
assert_eq!(
res,
vec!["Chocolate Forest".to_owned(), "New York Cheese".to_owned()]
);
assert_eq!(
db.into_transaction_log(),
vec![Transaction::from_sql_and_values(
DbBackend::Postgres,
r#"SELECT "cake"."name" AS "cake_name" FROM "cake""#,
vec![]
)]
);
use sea_orm::{entity::*, query::*, tests_cfg::cake, DeriveColumn, EnumIter};
#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)]
enum QueryAs {
CakeName,
NumOfCakes,
}
let res: Vec<(String, i64)> = cake::Entity::find()
.select_only()
.column_as(cake::Column::Name, QueryAs::CakeName)
.column_as(cake::Column::Id.count(), QueryAs::NumOfCakes)
.group_by(cake::Column::Name)
.into_values::<_, QueryAs>()
.all(&db)
.await?;
assert_eq!(res, vec![("Chocolate Forest".to_owned(), 2i64)]);
assert_eq!(
db.into_transaction_log(),
vec![Transaction::from_sql_and_values(
DbBackend::Postgres,
vec![
r#"SELECT "cake"."name" AS "cake_name", COUNT("cake"."id") AS "num_of_cakes""#,
r#"FROM "cake" GROUP BY "cake"."name""#,
]
.join(" ")
.as_str(),
vec![]
)]
);
sourcepub async fn one<'a, C>(self, db: &C) -> Result<Option<E::Model>, DbErr>where
C: ConnectionTrait,
pub async fn one<'a, C>(self, db: &C) -> Result<Option<E::Model>, DbErr>where
C: ConnectionTrait,
Get one Model from the SELECT query
Examples found in repository?
src/executor/insert.rs (line 203)
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
async fn exec_insert_with_returning<A, C>(
primary_key: Option<ValueTuple>,
mut insert_statement: InsertStatement,
db: &C,
) -> Result<<A::Entity as EntityTrait>::Model, DbErr>
where
<A::Entity as EntityTrait>::Model: IntoActiveModel<A>,
C: ConnectionTrait,
A: ActiveModelTrait,
{
let db_backend = db.get_database_backend();
let found = match db.support_returning() {
true => {
let returning = Query::returning().exprs(
<A::Entity as EntityTrait>::Column::iter()
.map(|c| cast_enum_as_text(Expr::col(c), &c)),
);
insert_statement.returning(returning);
SelectorRaw::<SelectModel<<A::Entity as EntityTrait>::Model>>::from_statement(
db_backend.build(&insert_statement),
)
.one(db)
.await?
}
false => {
let insert_res =
exec_insert::<A, _>(primary_key, db_backend.build(&insert_statement), db).await?;
<A::Entity as EntityTrait>::find_by_id(insert_res.last_insert_id)
.one(db)
.await?
}
};
match found {
Some(model) => Ok(model),
None => Err(DbErr::RecordNotFound(
"Failed to find inserted item".to_owned(),
)),
}
}
More examples
src/executor/update.rs (line 122)
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
async fn exec_update_and_return_updated<A, C>(
mut query: UpdateStatement,
model: A,
db: &C,
) -> Result<<A::Entity as EntityTrait>::Model, DbErr>
where
A: ActiveModelTrait,
C: ConnectionTrait,
{
match db.support_returning() {
true => {
let returning = Query::returning().exprs(
<A::Entity as EntityTrait>::Column::iter()
.map(|c| cast_enum_as_text(Expr::col(c), &c)),
);
query.returning(returning);
let db_backend = db.get_database_backend();
let found: Option<<A::Entity as EntityTrait>::Model> =
SelectorRaw::<SelectModel<<A::Entity as EntityTrait>::Model>>::from_statement(
db_backend.build(&query),
)
.one(db)
.await?;
// If we got `None` then we are updating a row that does not exist.
match found {
Some(model) => Ok(model),
None => Err(DbErr::RecordNotFound(
"None of the database rows are affected".to_owned(),
)),
}
}
false => {
// If we updating a row that does not exist then an error will be thrown here.
Updater::new(query).check_record_exists().exec(db).await?;
let primary_key_value = match model.get_primary_key_value() {
Some(val) => FromValueTuple::from_value_tuple(val),
None => return Err(DbErr::UpdateGetPrimaryKey),
};
let found = <A::Entity as EntityTrait>::find_by_id(primary_key_value)
.one(db)
.await?;
// If we cannot select the updated row from db by the cached primary key
match found {
Some(model) => Ok(model),
None => Err(DbErr::RecordNotFound(
"Failed to find updated item".to_owned(),
)),
}
}
}
}
source§impl<E> Select<E>where
E: EntityTrait,
impl<E> Select<E>where
E: EntityTrait,
sourcepub fn select_also<F>(self, _: F) -> SelectTwo<E, F>where
F: EntityTrait,
pub fn select_also<F>(self, _: F) -> SelectTwo<E, F>where
F: EntityTrait,
Selects and Entity and returns it together with the Entity from Self
sourcepub fn select_with<F>(self, _: F) -> SelectTwoMany<E, F>where
F: EntityTrait,
pub fn select_with<F>(self, _: F) -> SelectTwoMany<E, F>where
F: EntityTrait,
Makes a SELECT operation in conjunction to another relation
source§impl<E> Select<E>where
E: EntityTrait,
impl<E> Select<E>where
E: EntityTrait,
sourcepub fn left_join<R>(self, _: R) -> Selfwhere
R: EntityTrait,
E: Related<R>,
pub fn left_join<R>(self, _: R) -> Selfwhere
R: EntityTrait,
E: Related<R>,
Left Join with a Related Entity.
Examples found in repository?
src/query/join.rs (line 53)
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
pub fn find_also_related<R>(self, r: R) -> SelectTwo<E, R>
where
R: EntityTrait,
E: Related<R>,
{
self.left_join(r).select_also(r)
}
/// Left Join with a Related Entity and select the related Entity as a `Vec`
pub fn find_with_related<R>(self, r: R) -> SelectTwoMany<E, R>
where
R: EntityTrait,
E: Related<R>,
{
self.left_join(r).select_with(r)
}
sourcepub fn right_join<R>(self, _: R) -> Selfwhere
R: EntityTrait,
E: Related<R>,
pub fn right_join<R>(self, _: R) -> Selfwhere
R: EntityTrait,
E: Related<R>,
Right Join with a Related Entity.
sourcepub fn inner_join<R>(self, _: R) -> Selfwhere
R: EntityTrait,
E: Related<R>,
pub fn inner_join<R>(self, _: R) -> Selfwhere
R: EntityTrait,
E: Related<R>,
Inner Join with a Related Entity.
sourcepub fn reverse_join<R>(self, _: R) -> Selfwhere
R: EntityTrait + Related<E>,
pub fn reverse_join<R>(self, _: R) -> Selfwhere
R: EntityTrait + Related<E>,
Join with an Entity Related to me.
Left Join with a Related Entity and select both Entity.
Left Join with a Related Entity and select the related Entity as a Vec
sourcepub fn find_also_linked<L, T>(self, l: L) -> SelectTwo<E, T>where
L: Linked<FromEntity = E, ToEntity = T>,
T: EntityTrait,
pub fn find_also_linked<L, T>(self, l: L) -> SelectTwo<E, T>where
L: Linked<FromEntity = E, ToEntity = T>,
T: EntityTrait,
Left Join with a Linked Entity and select both Entity.
Trait Implementations§
source§impl<E, M> CursorTrait for Select<E>where
E: EntityTrait<Model = M>,
M: FromQueryResult + Sized + Send + Sync,
impl<E, M> CursorTrait for Select<E>where
E: EntityTrait<Model = M>,
M: FromQueryResult + Sized + Send + Sync,
§type Selector = SelectModel<M>
type Selector = SelectModel<M>
Select operation
source§impl<'db, C, M, E> PaginatorTrait<'db, C> for Select<E>where
C: ConnectionTrait,
E: EntityTrait<Model = M>,
M: FromQueryResult + Sized + Send + Sync + 'db,
impl<'db, C, M, E> PaginatorTrait<'db, C> for Select<E>where
C: ConnectionTrait,
E: EntityTrait<Model = M>,
M: FromQueryResult + Sized + Send + Sync + 'db,
source§impl<E> QueryFilter for Select<E>where
E: EntityTrait,
impl<E> QueryFilter for Select<E>where
E: EntityTrait,
type QueryStatement = SelectStatement
source§fn query(&mut self) -> &mut SelectStatement
fn query(&mut self) -> &mut SelectStatement
Add the query to perform a FILTER on
source§fn filter<F>(self, filter: F) -> Selfwhere
F: IntoCondition,
fn filter<F>(self, filter: F) -> Selfwhere
F: IntoCondition,
Add an AND WHERE expression Read more
source§fn belongs_to<M>(self, model: &M) -> Selfwhere
M: ModelTrait,
fn belongs_to<M>(self, model: &M) -> Selfwhere
M: ModelTrait,
Apply a where condition using the model’s primary key
source§fn belongs_to_tbl_alias<M>(self, model: &M, tbl_alias: &str) -> Selfwhere
M: ModelTrait,
fn belongs_to_tbl_alias<M>(self, model: &M, tbl_alias: &str) -> Selfwhere
M: ModelTrait,
Perform a check to determine table belongs to a Model through it’s name alias
source§impl<E> QueryOrder for Select<E>where
E: EntityTrait,
impl<E> QueryOrder for Select<E>where
E: EntityTrait,
type QueryStatement = SelectStatement
source§fn query(&mut self) -> &mut SelectStatement
fn query(&mut self) -> &mut SelectStatement
Add the query to perform an ORDER BY operation
source§fn order_by<C>(self, col: C, ord: Order) -> Selfwhere
C: IntoSimpleExpr,
fn order_by<C>(self, col: C, ord: Order) -> Selfwhere
C: IntoSimpleExpr,
Add an order_by expression Read more
source§fn order_by_asc<C>(self, col: C) -> Selfwhere
C: IntoSimpleExpr,
fn order_by_asc<C>(self, col: C) -> Selfwhere
C: IntoSimpleExpr,
Add an order_by expression (ascending) Read more
source§fn order_by_desc<C>(self, col: C) -> Selfwhere
C: IntoSimpleExpr,
fn order_by_desc<C>(self, col: C) -> Selfwhere
C: IntoSimpleExpr,
Add an order_by expression (descending) Read more
source§impl<E> QuerySelect for Select<E>where
E: EntityTrait,
impl<E> QuerySelect for Select<E>where
E: EntityTrait,
type QueryStatement = SelectStatement
source§fn query(&mut self) -> &mut SelectStatement
fn query(&mut self) -> &mut SelectStatement
Add the select SQL statement
source§fn select_only(self) -> Self
fn select_only(self) -> Self
Clear the selection list
source§fn column<C>(self, col: C) -> Selfwhere
C: ColumnTrait,
fn column<C>(self, col: C) -> Selfwhere
C: ColumnTrait,
Add a select column Read more
source§fn column_as<C, I>(self, col: C, alias: I) -> Selfwhere
C: IntoSimpleExpr,
I: IntoIdentity,
fn column_as<C, I>(self, col: C, alias: I) -> Selfwhere
C: IntoSimpleExpr,
I: IntoIdentity,
Add a select column with alias Read more
source§fn columns<C, I>(self, cols: I) -> Selfwhere
C: ColumnTrait,
I: IntoIterator<Item = C>,
fn columns<C, I>(self, cols: I) -> Selfwhere
C: ColumnTrait,
I: IntoIterator<Item = C>,
Select columns Read more
source§fn group_by<C>(self, col: C) -> Selfwhere
C: IntoSimpleExpr,
fn group_by<C>(self, col: C) -> Selfwhere
C: IntoSimpleExpr,
Add a group by column Read more
source§fn having<F>(self, filter: F) -> Selfwhere
F: IntoCondition,
fn having<F>(self, filter: F) -> Selfwhere
F: IntoCondition,
Add an AND HAVING expression Read more
source§fn distinct_on<T, I>(self, cols: I) -> Selfwhere
T: IntoColumnRef,
I: IntoIterator<Item = T>,
fn distinct_on<T, I>(self, cols: I) -> Selfwhere
T: IntoColumnRef,
I: IntoIterator<Item = T>,
Add a DISTINCT ON expression
NOTE: this function is only supported by
sqlx-postgres
Read moresource§fn join(self, join: JoinType, rel: RelationDef) -> Self
fn join(self, join: JoinType, rel: RelationDef) -> Self
Join via
RelationDef
.source§fn join_rev(self, join: JoinType, rel: RelationDef) -> Self
fn join_rev(self, join: JoinType, rel: RelationDef) -> Self
Join via
RelationDef
but in reverse direction.
Assume when there exist a relation A to B.
You can reverse join B from A.source§fn join_as<I>(self, join: JoinType, rel: RelationDef, alias: I) -> Selfwhere
I: IntoIden,
fn join_as<I>(self, join: JoinType, rel: RelationDef, alias: I) -> Selfwhere
I: IntoIden,
Join via
RelationDef
with table alias.source§fn join_as_rev<I>(self, join: JoinType, rel: RelationDef, alias: I) -> Selfwhere
I: IntoIden,
fn join_as_rev<I>(self, join: JoinType, rel: RelationDef, alias: I) -> Selfwhere
I: IntoIden,
Join via
RelationDef
with table alias but in reverse direction.
Assume when there exist a relation A to B.
You can reverse join B from A.Select lock shared
source§fn lock_exclusive(self) -> Self
fn lock_exclusive(self) -> Self
Select lock exclusive
source§impl<E> QueryTrait for Select<E>where
E: EntityTrait,
impl<E> QueryTrait for Select<E>where
E: EntityTrait,
§type QueryStatement = SelectStatement
type QueryStatement = SelectStatement
Constrain the QueryStatement to QueryStatementBuilder trait
source§fn query(&mut self) -> &mut SelectStatement
fn query(&mut self) -> &mut SelectStatement
Get a mutable ref to the query builder
source§fn as_query(&self) -> &SelectStatement
fn as_query(&self) -> &SelectStatement
Get an immutable ref to the query builder
source§fn into_query(self) -> SelectStatement
fn into_query(self) -> SelectStatement
Take ownership of the query builder