use super::SqlQueryBuilder;
use crate::adapter::DatabaseAdapter;
use crate::error::{QuickDbError, QuickDbResult};
use crate::model::{FieldDefinition, FieldType};
use crate::pool::DatabaseConnection;
use crate::types::*;
use async_trait::async_trait;
use rat_logger::{debug, info, warn};
use sqlx::{Column, Row, sqlite::SqliteRow};
use std::collections::HashMap;
use super::adapter::SqliteAdapter;
use super::query as sqlite_query;
use super::schema as sqlite_schema;
fn check_table_not_exist_error(error: &sqlx::Error, table: &str) -> bool {
let error_string = error.to_string().to_lowercase();
error_string.contains("no such table") ||
error_string.contains(&format!("no such table: {}", table.to_lowercase())) ||
error_string.contains("table") && error_string.contains("not found")
}
#[async_trait]
impl DatabaseAdapter for SqliteAdapter {
async fn create(
&self,
connection: &DatabaseConnection,
table: &str,
data: &HashMap<String, DataValue>,
id_strategy: &IdStrategy,
alias: &str,
) -> QuickDbResult<DataValue> {
let pool = match connection {
DatabaseConnection::SQLite(pool) => pool,
_ => {
return Err(QuickDbError::ConnectionError {
message: "Invalid connection type for SQLite".to_string(),
});
}
};
if !self.table_exists(connection, table).await? {
let _lock = self.acquire_table_lock(table).await;
if !self.table_exists(connection, table).await? {
if let Some(model_meta) = crate::manager::get_model_with_alias(table, alias) {
debug!("表 {} 不存在,使用预定义模型元数据创建", table);
self.create_table(connection, table, &model_meta.fields, id_strategy, alias)
.await?;
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
debug!("⏱️ 等待100ms确保表 '{}' 创建完成", table);
} else {
return Err(QuickDbError::ValidationError {
field: "table_creation".to_string(),
message: format!(
"表 '{}' 不存在,且没有预定义的模型元数据。请先定义模型并使用 define_model! 宏明确指定字段类型。",
table
),
});
}
} else {
debug!("表 {} 已存在,跳过创建", table);
}
}
let (sql, params) = SqlQueryBuilder::new()
.insert(data.clone())
.build(table, alias)?;
let mut query = sqlx::query(&sql);
for param in ¶ms {
match param {
DataValue::String(s) => {
query = query.bind(s);
}
DataValue::Int(i) => {
query = query.bind(i);
}
DataValue::UInt(u) => {
if *u <= i64::MAX as u64 {
query = query.bind(*u as i64);
} else {
query = query.bind(u.to_string());
}
}
DataValue::Float(f) => {
query = query.bind(f);
}
DataValue::Bool(b) => {
query = query.bind(b);
}
DataValue::Bytes(bytes) => {
query = query.bind(bytes);
}
DataValue::DateTime(dt) => {
query = query.bind(dt.timestamp());
}
DataValue::DateTimeUTC(dt) => {
query = query.bind(dt.timestamp());
}
DataValue::Uuid(uuid) => {
query = query.bind(uuid.to_string());
}
DataValue::Json(json) => {
query = query.bind(json.to_string());
}
DataValue::Array(arr) => {
let string_array: Result<Vec<String>, QuickDbError> = arr.iter().map(|item| {
Ok(match item {
DataValue::String(s) => s.clone(),
DataValue::Int(i) => i.to_string(),
DataValue::Float(f) => f.to_string(),
DataValue::Uuid(uuid) => uuid.to_string(),
_ => {
return Err(QuickDbError::ValidationError {
field: "array_field".to_string(),
message: format!("Array字段不支持该类型: {:?},只支持String、Int、Float、Uuid类型", item),
});
}
})
}).collect();
let string_array = string_array?;
let json = serde_json::to_string(&string_array).unwrap_or_default();
query = query.bind(json);
}
DataValue::Object(_) => {
let json = param.to_json_value().to_string();
query = query.bind(json);
}
DataValue::Null => {
query = query.bind(Option::<String>::None);
}
}
}
let result = query
.execute(pool)
.await
.map_err(|e| QuickDbError::QueryError {
message: format!("执行SQLite插入失败: {}", e),
})?;
if let Some(id_value) = data.get("id") {
Ok(id_value.clone())
} else if let Some(id_value) = data.get("_id") {
Ok(id_value.clone())
} else {
let id = result.last_insert_rowid();
if id > 0 {
Ok(DataValue::Int(id))
} else {
let mut result_map = HashMap::new();
result_map.insert("id".to_string(), DataValue::Int(id));
result_map.insert(
"affected_rows".to_string(),
DataValue::Int(result.rows_affected() as i64),
);
Ok(DataValue::Object(result_map))
}
}
}
async fn find_by_id(
&self,
connection: &DatabaseConnection,
table: &str,
id: &DataValue,
alias: &str,
) -> QuickDbResult<Option<DataValue>> {
let pool = match connection {
DatabaseConnection::SQLite(pool) => pool,
_ => {
return Err(QuickDbError::ConnectionError {
message: "Invalid connection type for SQLite".to_string(),
});
}
};
{
let sql = format!("SELECT * FROM {} WHERE id = ? LIMIT 1", table);
let mut query = sqlx::query(&sql);
match id {
DataValue::String(s) => {
query = query.bind(s);
}
DataValue::Int(i) => {
query = query.bind(i);
}
_ => {
query = query.bind(id.to_string());
}
}
let row = query
.fetch_optional(pool)
.await
.map_err(|e| {
if check_table_not_exist_error(&e, table) {
QuickDbError::TableNotExistError {
table: table.to_string(),
message: format!("SQLite表 '{}' 不存在", table),
}
} else {
QuickDbError::QueryError {
message: format!("执行SQLite根据ID查询失败: {}", e),
}
}
})?;
match row {
Some(r) => {
let model_meta = crate::manager::get_model_with_alias(table, alias)
.ok_or_else(|| QuickDbError::ValidationError {
field: "model".to_string(),
message: format!("模型 '{}' 不存在", table),
})?;
let data_map = super::data_conversion::row_to_data_map_with_metadata(
&r,
&model_meta.fields,
)?;
Ok(Some(DataValue::Object(data_map)))
}
None => Ok(None),
}
}
}
async fn find_with_cache_control(
&self,
connection: &DatabaseConnection,
table: &str,
conditions: &[QueryConditionWithConfig],
options: &QueryOptions,
alias: &str,
bypass_cache: bool,
) -> QuickDbResult<Vec<DataValue>> {
let condition_groups: Vec<QueryConditionGroupWithConfig> = if conditions.is_empty() {
vec![]
} else {
let group_conditions = conditions
.iter()
.map(|c| QueryConditionGroupWithConfig::Single(c.clone()))
.collect();
vec![QueryConditionGroupWithConfig::GroupWithConfig {
operator: LogicalOperator::And,
conditions: group_conditions,
}]
};
self.find_with_groups_with_cache_control_and_config(connection, table, &condition_groups, options, alias, bypass_cache).await
}
async fn find_with_groups_with_cache_control(
&self,
connection: &DatabaseConnection,
table: &str,
condition_groups: &[QueryConditionGroup],
options: &QueryOptions,
alias: &str,
bypass_cache: bool,
) -> QuickDbResult<Vec<DataValue>> {
let pool = match connection {
DatabaseConnection::SQLite(pool) => pool,
_ => {
return Err(QuickDbError::ConnectionError {
message: "Invalid connection type for SQLite".to_string(),
});
}
};
{
let (sql, params) = SqlQueryBuilder::new()
.select(&["*"])
.where_condition_groups(condition_groups)
.limit(options.pagination.as_ref().map(|p| p.limit).unwrap_or(1000))
.offset(options.pagination.as_ref().map(|p| p.skip).unwrap_or(0))
.build(table, alias)?;
debug!("执行SQLite条件组合查询: {}", sql);
let mut query = sqlx::query(&sql);
for param in ¶ms {
match param {
DataValue::String(s) => {
query = query.bind(s);
}
DataValue::Int(i) => {
query = query.bind(i);
}
DataValue::Float(f) => {
query = query.bind(f);
}
DataValue::Bool(b) => {
query = query.bind(b);
}
DataValue::DateTime(dt) => {
query = query.bind(dt.timestamp());
}
DataValue::DateTimeUTC(dt) => {
query = query.bind(dt.timestamp());
} DataValue::Null => {
query = query.bind(Option::<String>::None);
}
_ => {
query = query.bind(param.to_string());
}
}
}
let rows = query
.fetch_all(pool)
.await
.map_err(|e| {
if check_table_not_exist_error(&e, table) {
QuickDbError::TableNotExistError {
table: table.to_string(),
message: format!("SQLite表 '{}' 不存在", table),
}
} else {
QuickDbError::QueryError {
message: format!("执行SQLite条件组合查询失败: {}", e),
}
}
})?;
let model_meta =
crate::manager::get_model_with_alias(table, alias).ok_or_else(|| {
QuickDbError::ValidationError {
field: "model".to_string(),
message: format!("模型 '{}' 不存在", table),
}
})?;
let mut results = Vec::new();
for row in rows {
let data_map = super::data_conversion::row_to_data_map_with_metadata(
&row,
&model_meta.fields,
)?;
results.push(DataValue::Object(data_map));
}
Ok(results)
}
}
async fn find_with_groups_with_cache_control_and_config(
&self,
connection: &DatabaseConnection,
table: &str,
condition_groups: &[QueryConditionGroupWithConfig],
options: &QueryOptions,
alias: &str,
bypass_cache: bool,
) -> QuickDbResult<Vec<DataValue>> {
fn convert_group(group: &QueryConditionGroupWithConfig) -> QueryConditionGroup {
match group {
QueryConditionGroupWithConfig::Single(c) => {
QueryConditionGroup::Single(QueryCondition {
field: c.field.clone(),
operator: c.operator.clone(),
value: c.value.clone(),
})
}
QueryConditionGroupWithConfig::GroupWithConfig { operator, conditions } => {
QueryConditionGroup::Group {
operator: operator.clone(),
conditions: conditions.iter().map(convert_group).collect(),
}
}
}
}
let simple_groups: Vec<QueryConditionGroup> =
condition_groups.iter().map(convert_group).collect();
self.find_with_groups_with_cache_control(connection, table, &simple_groups, options, alias, bypass_cache).await
}
async fn find(
&self,
connection: &DatabaseConnection,
table: &str,
conditions: &[QueryConditionWithConfig],
options: &QueryOptions,
alias: &str,
) -> QuickDbResult<Vec<DataValue>> {
self.find_with_cache_control(connection, table, conditions, options, alias, false).await
}
async fn find_with_groups(
&self,
connection: &DatabaseConnection,
table: &str,
condition_groups: &[QueryConditionGroup],
options: &QueryOptions,
alias: &str,
) -> QuickDbResult<Vec<DataValue>> {
self.find_with_groups_with_cache_control(connection, table, condition_groups, options, alias, false).await
}
async fn update(
&self,
connection: &DatabaseConnection,
table: &str,
conditions: &[QueryConditionWithConfig],
data: &HashMap<String, DataValue>,
alias: &str,
) -> QuickDbResult<u64> {
let pool = match connection {
DatabaseConnection::SQLite(pool) => pool,
_ => {
return Err(QuickDbError::ConnectionError {
message: "Invalid connection type for SQLite".to_string(),
});
}
};
{
let model_meta =
crate::manager::get_model_with_alias(table, alias).ok_or_else(|| {
QuickDbError::ValidationError {
field: "model".to_string(),
message: format!("模型 '{}' 不存在", table),
}
})?;
let field_map: std::collections::HashMap<String, crate::model::FieldDefinition> =
model_meta
.fields
.iter()
.map(|(name, f)| (name.clone(), f.clone()))
.collect();
let validated_data =
crate::utils::timezone::process_data_fields_from_metadata(data.clone(), &field_map);
let (sql, params) = SqlQueryBuilder::new()
.update(validated_data)
.where_conditions(conditions)
.build(table, alias)?;
let mut complete_sql = sql.clone();
for param in ¶ms {
let param_value = match param {
DataValue::String(s) => format!("'{}'", s.replace('\'', "''")),
DataValue::Int(i) => i.to_string(),
DataValue::Float(f) => f.to_string(),
DataValue::Bool(b) => {
if *b {
"1".to_string()
} else {
"0".to_string()
}
}
DataValue::DateTime(dt) => dt.timestamp().to_string(),
DataValue::DateTimeUTC(dt) => dt.timestamp().to_string(),
DataValue::Null => "NULL".to_string(),
_ => format!("'{}'", param.to_string()),
};
complete_sql = complete_sql.replacen('?', ¶m_value, 1);
}
debug!("[SQLite] Complete SQL: {}", complete_sql);
let mut query = sqlx::query(&sql);
for param in ¶ms {
match param {
DataValue::String(s) => {
query = query.bind(s);
}
DataValue::Int(i) => {
query = query.bind(i);
}
DataValue::Float(f) => {
query = query.bind(f);
}
DataValue::Bool(b) => {
query = query.bind(b);
}
DataValue::DateTime(dt) => {
query = query.bind(dt.timestamp());
}
DataValue::DateTimeUTC(dt) => {
query = query.bind(dt.timestamp());
}
_ => {
query = query.bind(param.to_string());
}
}
}
let result = query
.execute(pool)
.await
.map_err(|e| {
if check_table_not_exist_error(&e, table) {
QuickDbError::TableNotExistError {
table: table.to_string(),
message: format!("SQLite表 '{}' 不存在", table),
}
} else {
QuickDbError::QueryError {
message: format!("执行SQLite更新失败: {}", e),
}
}
})?;
Ok(result.rows_affected())
}
}
async fn update_by_id(
&self,
connection: &DatabaseConnection,
table: &str,
id: &DataValue,
data: &HashMap<String, DataValue>,
alias: &str,
) -> QuickDbResult<bool> {
let condition = QueryConditionWithConfig {
field: "id".to_string(),
operator: QueryOperator::Eq,
value: id.clone(),
case_insensitive: false,
};
let affected_rows = self
.update(connection, table, &[condition], data, alias)
.await?;
Ok(affected_rows > 0)
}
async fn update_with_operations(
&self,
connection: &DatabaseConnection,
table: &str,
conditions: &[QueryConditionWithConfig],
operations: &[crate::types::UpdateOperation],
alias: &str,
) -> QuickDbResult<u64> {
let pool = match connection {
DatabaseConnection::SQLite(pool) => pool,
_ => {
return Err(QuickDbError::ConnectionError {
message: "Invalid connection type for SQLite".to_string(),
});
}
};
let model_meta = crate::manager::get_model_with_alias(table, alias).ok_or_else(|| {
QuickDbError::ValidationError {
field: "model".to_string(),
message: format!("模型 '{}' 不存在", table),
}
})?;
let field_map: std::collections::HashMap<String, crate::model::FieldDefinition> =
model_meta
.fields
.iter()
.map(|(name, f)| (name.clone(), f.clone()))
.collect();
let mut set_clauses = Vec::new();
let mut params = Vec::new();
for operation in operations {
match &operation.operation {
crate::types::UpdateOperator::Set => {
set_clauses.push(format!("{} = ?", operation.field));
let mut operation_data = std::collections::HashMap::new();
operation_data.insert(operation.field.clone(), operation.value.clone());
let validated_data = crate::utils::timezone::process_data_fields_from_metadata(
operation_data,
&field_map,
);
if let Some(converted_value) = validated_data.get(&operation.field) {
params.push(converted_value.clone());
} else {
params.push(operation.value.clone());
}
}
crate::types::UpdateOperator::Increment => {
set_clauses.push(format!("{} = {} + ?", operation.field, operation.field));
params.push(operation.value.clone());
}
crate::types::UpdateOperator::Decrement => {
set_clauses.push(format!("{} = {} - ?", operation.field, operation.field));
params.push(operation.value.clone());
}
crate::types::UpdateOperator::Multiply => {
set_clauses.push(format!("{} = {} * ?", operation.field, operation.field));
params.push(operation.value.clone());
}
crate::types::UpdateOperator::Divide => {
set_clauses.push(format!("{} = {} / ?", operation.field, operation.field));
params.push(operation.value.clone());
}
crate::types::UpdateOperator::PercentIncrease => {
set_clauses.push(format!(
"{} = {} * (1.0 + ?/100.0)",
operation.field, operation.field
));
params.push(operation.value.clone());
}
crate::types::UpdateOperator::PercentDecrease => {
set_clauses.push(format!(
"{} = {} * (1.0 - ?/100.0)",
operation.field, operation.field
));
params.push(operation.value.clone());
}
}
}
if set_clauses.is_empty() {
return Err(QuickDbError::ValidationError {
field: "operations".to_string(),
message: "更新操作不能为空".to_string(),
});
}
let mut sql = format!("UPDATE {} SET {}", table, set_clauses.join(", "));
if !conditions.is_empty() {
let (where_clause, mut where_params) = SqlQueryBuilder::new()
.build_where_clause_with_offset(conditions, params.len() + 1, table, alias)?;
sql.push_str(&format!(" WHERE {}", where_clause));
params.extend(where_params);
}
debug!("执行SQLite操作更新: {}", sql);
self.execute_update(pool, &sql, ¶ms).await
}
async fn delete(
&self,
connection: &DatabaseConnection,
table: &str,
conditions: &[QueryConditionWithConfig],
alias: &str,
) -> QuickDbResult<u64> {
sqlite_query::delete(self, connection, table, conditions, alias).await
}
async fn delete_by_id(
&self,
connection: &DatabaseConnection,
table: &str,
id: &DataValue,
alias: &str,
) -> QuickDbResult<bool> {
sqlite_query::delete_by_id(self, connection, table, id, alias).await
}
async fn count(
&self,
connection: &DatabaseConnection,
table: &str,
conditions: &[QueryConditionWithConfig],
alias: &str,
) -> QuickDbResult<u64> {
sqlite_query::count(self, connection, table, conditions, alias).await
}
async fn count_with_groups(
&self,
connection: &DatabaseConnection,
table: &str,
condition_groups: &[QueryConditionGroupWithConfig],
alias: &str,
) -> QuickDbResult<u64> {
sqlite_query::count_with_groups(self, connection, table, condition_groups, alias).await
}
async fn create_table(
&self,
connection: &DatabaseConnection,
table: &str,
fields: &HashMap<String, FieldDefinition>,
id_strategy: &IdStrategy,
alias: &str,
) -> QuickDbResult<()> {
sqlite_schema::create_table(self, connection, table, fields, id_strategy).await
}
async fn create_index(
&self,
connection: &DatabaseConnection,
table: &str,
index_name: &str,
fields: &[String],
unique: bool,
) -> QuickDbResult<()> {
sqlite_schema::create_index(self, connection, table, index_name, fields, unique).await
}
async fn table_exists(
&self,
connection: &DatabaseConnection,
table: &str,
) -> QuickDbResult<bool> {
sqlite_schema::table_exists(self, connection, table).await
}
async fn drop_table(&self, connection: &DatabaseConnection, table: &str) -> QuickDbResult<()> {
sqlite_schema::drop_table(self, connection, table).await
}
async fn get_server_version(&self, connection: &DatabaseConnection) -> QuickDbResult<String> {
sqlite_schema::get_server_version(self, connection).await
}
async fn create_stored_procedure(
&self,
connection: &DatabaseConnection,
config: &crate::stored_procedure::StoredProcedureConfig,
) -> QuickDbResult<crate::stored_procedure::StoredProcedureCreateResult> {
use crate::stored_procedure::{JoinType, StoredProcedureCreateResult};
debug!("开始创建SQLite存储过程: {}", config.procedure_name);
config
.validate()
.map_err(|e| crate::error::QuickDbError::ValidationError {
field: "config".to_string(),
message: format!("存储过程配置验证失败: {}", e),
})?;
let pool = match connection {
DatabaseConnection::SQLite(pool) => pool,
_ => {
return Err(crate::error::QuickDbError::ConnectionError {
message: "Invalid connection type for SQLite".to_string(),
});
}
};
for model_meta in &config.dependencies {
let table_name = &model_meta.collection_name;
if !self.table_exists(connection, table_name).await? {
debug!("依赖表 {} 不存在,尝试创建", table_name);
let id_strategy = crate::manager::get_id_strategy(&config.database)
.unwrap_or(IdStrategy::AutoIncrement);
self.create_table(
connection,
table_name,
&model_meta.fields,
&id_strategy,
&config.database,
)
.await?;
}
}
let sql_template = self.generate_stored_procedure_sql(&config).await?;
debug!("生成存储过程SQL模板: {}", sql_template);
let procedure_info = crate::stored_procedure::StoredProcedureInfo {
config: config.clone(),
template: sql_template.clone(),
db_type: "SQLite".to_string(),
created_at: chrono::Utc::now(),
};
let mut procedures = self.stored_procedures.lock().await;
procedures.insert(config.procedure_name.clone(), procedure_info);
debug!(
"✅ 存储过程 {} 模板已存储到适配器映射表",
config.procedure_name
);
Ok(StoredProcedureCreateResult {
success: true,
procedure_name: config.procedure_name.clone(),
error: None,
})
}
async fn execute_stored_procedure(
&self,
connection: &DatabaseConnection,
procedure_name: &str,
database: &str,
params: Option<std::collections::HashMap<String, crate::types::DataValue>>,
) -> QuickDbResult<crate::stored_procedure::StoredProcedureQueryResult> {
use crate::adapter::sqlite::adapter::SqliteAdapter;
let procedures = self.stored_procedures.lock().await;
let procedure_info = procedures.get(procedure_name).ok_or_else(|| {
crate::error::QuickDbError::ValidationError {
field: "procedure_name".to_string(),
message: format!("存储过程 '{}' 不存在", procedure_name),
}
})?;
let sql_template = procedure_info.template.clone();
drop(procedures);
debug!(
"执行存储过程查询: {}, 模板: {}",
procedure_name, sql_template
);
let final_sql = self
.build_final_query_from_template(&sql_template, params)
.await?;
let pool = match connection {
DatabaseConnection::SQLite(pool) => pool,
_ => {
return Err(QuickDbError::ConnectionError {
message: "Invalid connection type for SQLite".to_string(),
});
}
};
debug!("执行存储过程查询SQL: {}", final_sql);
let rows = sqlx::query(&final_sql).fetch_all(pool).await.map_err(|e| {
QuickDbError::QueryError {
message: format!("执行存储过程查询失败: {}", e),
}
})?;
let mut query_result = Vec::new();
for row in rows {
let data_map = self.row_to_data_map(&row)?;
query_result.push(data_map);
}
let mut result = Vec::new();
for row_data in query_result {
let mut row_map = std::collections::HashMap::new();
for (key, value) in row_data {
row_map.insert(key, value);
}
result.push(row_map);
}
debug!(
"存储过程 {} 执行完成,返回 {} 条记录",
procedure_name,
result.len()
);
Ok(result)
}
}
impl SqliteAdapter {
async fn build_final_query_from_template(
&self,
template: &str,
params: Option<std::collections::HashMap<String, crate::types::DataValue>>,
) -> QuickDbResult<String> {
let mut final_sql = template.to_string();
if let Some(param_map) = params {
if let Some(where_clause) = param_map.get("WHERE") {
let where_str = match where_clause {
crate::types::DataValue::String(s) => s.clone(),
_ => where_clause.to_string(),
};
final_sql = final_sql.replace("{WHERE}", &format!(" WHERE {}", where_str));
} else {
final_sql = final_sql.replace("{WHERE}", "");
}
if let Some(group_by) = param_map.get("GROUP_BY") {
let group_by_str = match group_by {
crate::types::DataValue::String(s) => s.clone(),
_ => group_by.to_string(),
};
final_sql = final_sql.replace("{GROUP_BY}", &format!(" GROUP BY {}", group_by_str));
} else {
final_sql = final_sql.replace("{GROUP_BY}", "");
}
if let Some(having) = param_map.get("HAVING") {
let having_str = match having {
crate::types::DataValue::String(s) => s.clone(),
_ => having.to_string(),
};
final_sql = final_sql.replace("{HAVING}", &format!(" HAVING {}", having_str));
} else {
final_sql = final_sql.replace("{HAVING}", "");
}
if let Some(order_by) = param_map.get("ORDER_BY") {
let order_by_str = match order_by {
crate::types::DataValue::String(s) => s.clone(),
_ => order_by.to_string(),
};
final_sql = final_sql.replace("{ORDER_BY}", &format!(" ORDER BY {}", order_by_str));
} else {
final_sql = final_sql.replace("{ORDER_BY}", "");
}
if let Some(limit) = param_map.get("LIMIT") {
let limit_str = match limit {
crate::types::DataValue::Int(i) => i.to_string(),
_ => limit.to_string(),
};
final_sql = final_sql.replace("{LIMIT}", &format!(" LIMIT {}", limit_str));
} else {
final_sql = final_sql.replace("{LIMIT}", "");
}
if let Some(offset) = param_map.get("OFFSET") {
let offset_str = match offset {
crate::types::DataValue::Int(i) => i.to_string(),
_ => offset.to_string(),
};
final_sql = final_sql.replace("{OFFSET}", &format!(" OFFSET {}", offset_str));
} else {
final_sql = final_sql.replace("{OFFSET}", "");
}
} else {
final_sql = final_sql
.replace("{WHERE}", "")
.replace("{GROUP_BY}", "")
.replace("{HAVING}", "")
.replace("{ORDER_BY}", "")
.replace("{LIMIT}", "")
.replace("{OFFSET}", "");
}
final_sql = final_sql
.replace("{WHERE}", "")
.replace("{GROUP_BY}", "")
.replace("{HAVING}", "")
.replace("{ORDER_BY}", "")
.replace("{LIMIT}", "")
.replace("{OFFSET}", "")
.replace(" ", " ")
.replace(" ,", ",")
.replace(", ", ", ");
final_sql = final_sql.trim().to_string();
info!("构建的最终SQL: {}", final_sql);
Ok(final_sql)
}
}