elif_orm/query/
dml.rs

1//! Query Builder DML operations (INSERT, UPDATE, DELETE)
2
3use super::builder::QueryBuilder;
4use super::types::*;
5use super::upsert::UpsertBuilder;
6use serde_json::Value;
7
8impl<M> QueryBuilder<M> {
9    /// Start an INSERT query
10    pub fn insert_into(mut self, table: &str) -> Self {
11        self.query_type = QueryType::Insert;
12        self.insert_table = Some(table.to_string());
13        self
14    }
15
16    /// Start an UPDATE query
17    pub fn update(mut self, table: &str) -> Self {
18        self.query_type = QueryType::Update;
19        self.update_table = Some(table.to_string());
20        self
21    }
22
23    /// Start a DELETE query
24    pub fn delete_from(mut self, table: &str) -> Self {
25        self.query_type = QueryType::Delete;
26        self.delete_table = Some(table.to_string());
27        self
28    }
29
30    /// Set a column value (for INSERT/UPDATE)
31    pub fn set<T: Into<Value>>(mut self, column: &str, value: T) -> Self {
32        self.set_clauses.push(SetClause {
33            column: column.to_string(),
34            value: Some(value.into()),
35        });
36        self
37    }
38
39    /// Set a column to NULL (for INSERT/UPDATE)
40    pub fn set_null(mut self, column: &str) -> Self {
41        self.set_clauses.push(SetClause {
42            column: column.to_string(),
43            value: None,
44        });
45        self
46    }
47
48    /// Set multiple values at once
49    pub fn set_values(mut self, values: Vec<(String, Value)>) -> Self {
50        for (column, value) in values {
51            self.set_clauses.push(SetClause {
52                column,
53                value: Some(value),
54            });
55        }
56        self
57    }
58
59    /// Upsert operation (INSERT ... ON CONFLICT UPDATE)
60    pub fn upsert(mut self, table: &str, conflict_columns: Vec<&str>) -> UpsertBuilder<M> {
61        self.query_type = QueryType::Insert;
62        self.insert_table = Some(table.to_string());
63
64        UpsertBuilder {
65            query_builder: self,
66            conflict_columns: conflict_columns
67                .into_iter()
68                .map(|s| s.to_string())
69                .collect(),
70            update_clauses: Vec::new(),
71        }
72    }
73}