From e66cfd1ab16134f789fdb2479420d68bffb42461 Mon Sep 17 00:00:00 2001 From: Chris Tsang Date: Mon, 31 May 2021 23:37:37 +0800 Subject: [PATCH] Inserter --- Cargo.toml | 2 +- src/connector/insert.rs | 34 ++++++++++++++++++++++++++++++++++ src/connector/mod.rs | 2 ++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/connector/insert.rs diff --git a/Cargo.toml b/Cargo.toml index 7b820837..5ecefe7a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,7 @@ path = "src/lib.rs" [dependencies] async-trait = "^0.1" futures = { version = "^0.3" } -sea-query = { path = "../sea-query", version = "^0.11" } +sea-query = { path = "../sea-query", version = "^0.12" } sea-orm-macros = { path = "sea-orm-macros", optional = true } # sea-schema = { path = "../sea-schema" } serde = { version = "^1.0", features = [ "derive" ] } diff --git a/src/connector/insert.rs b/src/connector/insert.rs new file mode 100644 index 00000000..1debda32 --- /dev/null +++ b/src/connector/insert.rs @@ -0,0 +1,34 @@ +use crate::{Connection, Database, ExecErr, Statement}; +use sea_query::{InsertStatement, QueryBuilder}; + +#[derive(Clone, Debug)] +pub struct Inserter { + query: InsertStatement, +} + +#[derive(Clone, Debug)] +pub struct InsertResult { + pub last_insert_id: u64, +} + +impl Inserter { + pub fn new(query: InsertStatement) -> Self { + Self { query } + } + + pub fn build(&self, builder: B) -> Statement + where + B: QueryBuilder, + { + self.query.build(builder).into() + } + + pub async fn exec(self, db: &Database) -> Result { + let builder = db.get_query_builder_backend(); + let result = db.get_connection().execute(self.build(builder)).await?; + // TODO: Postgres instead use query_one + returning clause + Ok(InsertResult { + last_insert_id: result.last_insert_id(), + }) + } +} diff --git a/src/connector/mod.rs b/src/connector/mod.rs index bb1585d8..fcebe06d 100644 --- a/src/connector/mod.rs +++ b/src/connector/mod.rs @@ -1,7 +1,9 @@ mod executor; +mod insert; mod select; pub use executor::*; +pub use insert::*; pub use select::*; use crate::{DatabaseConnection, QueryResult, Statement, TypeErr};