From 25432e68d00ce05040b6a584c17f3e3ff9e0bec2 Mon Sep 17 00:00:00 2001 From: Chris Tsang Date: Sat, 17 Jul 2021 23:56:32 +0800 Subject: [PATCH] from_raw_sql example --- src/database/statement.rs | 14 ++++++++++-- src/executor/select.rs | 45 ++++++++++++++++++++++++++++++++++++++- src/query/mod.rs | 2 +- 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/database/statement.rs b/src/database/statement.rs index 007e167f..91a1c3c8 100644 --- a/src/database/statement.rs +++ b/src/database/statement.rs @@ -1,6 +1,6 @@ use crate::DbBackend; use sea_query::{ - inject_parameters, MysqlQueryBuilder, PostgresQueryBuilder, SqliteQueryBuilder, Values, + inject_parameters, MysqlQueryBuilder, PostgresQueryBuilder, SqliteQueryBuilder, Value, Values }; use std::fmt; @@ -24,7 +24,17 @@ impl Statement { } } - pub fn from_string_values_tuple( + pub fn from_sql_and_values(db_backend: DbBackend, sql: &str, values: I) -> Self + where + I: IntoIterator, + { + Self::from_string_values_tuple( + db_backend, + (sql.to_owned(), Values(values.into_iter().collect())), + ) + } + + pub(crate) fn from_string_values_tuple( db_backend: DbBackend, stmt: (String, Values), ) -> Statement { diff --git a/src/executor/select.rs b/src/executor/select.rs index 77acd31c..ffc94d64 100644 --- a/src/executor/select.rs +++ b/src/executor/select.rs @@ -76,7 +76,50 @@ impl Select where E: EntityTrait, { - pub fn from_raw_sql(stmt: Statement) -> SelectorRaw> { + /// ``` + /// # #[cfg(feature = "mock")] + /// # use sea_orm::{error::*, tests_cfg::*, MockDatabase, Transaction, DbBackend}; + /// # + /// # let db = MockDatabase::new(DbBackend::Postgres) + /// # .append_query_results(vec![ + /// # vec![ + /// # cake::Model { + /// # id: 1, + /// # name: "New York Cheese".to_owned(), + /// # }, + /// # ], + /// # ]) + /// # .into_connection(); + /// # + /// use sea_orm::{entity::*, query::*, tests_cfg::cake}; + /// + /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # + /// assert_eq!( + /// cake::Entity::find().from_raw_sql( + /// Statement::from_sql_and_values( + /// DbBackend::Postgres, r#"SELECT "cake"."id", "cake"."name" FROM "cake""#, vec![] + /// ) + /// ).one(&db).await?, + /// Some(cake::Model { + /// id: 1, + /// name: "New York Cheese".to_owned(), + /// }) + /// ); + /// # + /// # Ok(()) + /// # }); + /// + /// assert_eq!( + /// db.into_transaction_log(), + /// vec![ + /// Transaction::from_sql_and_values( + /// DbBackend::Postgres, r#"SELECT "cake"."id", "cake"."name" FROM "cake""#, vec![] + /// ), + /// ]); + /// ``` + #[allow(clippy::wrong_self_convention)] + pub fn from_raw_sql(self, stmt: Statement) -> SelectorRaw> { SelectorRaw { stmt, selector: SelectModel { model: PhantomData }, diff --git a/src/query/mod.rs b/src/query/mod.rs index 86668231..e41b8dc2 100644 --- a/src/query/mod.rs +++ b/src/query/mod.rs @@ -20,4 +20,4 @@ pub use select::*; pub use traits::*; pub use update::*; -pub use crate::executor::{InsertResult, UpdateResult}; +pub use crate::{Statement, InsertResult, UpdateResult}; \ No newline at end of file