use rusqlite::{params, Connection};
fn build_sql_query(table_name: &str, column_name1: &str, value1: &str, column_name2: &str, value2: &str) -> Result<String, rusqlite::Error> {
let conn = Connection::open_in_memory()?;
let mut stmt = conn.prepare(&format!(
"SELECT * FROM {} WHERE {} =? AND {} =?",
table_name, column_name1, column_name2
))?;
let result = stmt.query_row(params![value1, value2], |row| {
Ok(row.get(0)?)
});
match result {
Ok(_) => {
let sql = format!(
"SELECT * FROM {} WHERE {} = '{}' AND {} = '{}'",
table_name, column_name1, value1, column_name2, value2
);
Ok(sql)
},
Err(e) => Err(e),
}
}
Rust 字符串拼接方法选择依据
- 使用
format!
宏:在构建 SQL 语句的框架时,format!
宏非常方便。它允许我们像使用格式化字符串一样,将变量插入到字符串中。例如 format!("SELECT * FROM {} WHERE {} =? AND {} =?", table_name, column_name1, column_name2)
这样可以灵活地构建基本的 SQL 结构。
- 参数化查询:为了防止 SQL 注入,使用
rusqlite
库提供的参数化查询方式。在 prepare
方法中使用占位符 ?
,然后通过 params![value1, value2]
来传递实际的值。这样数据库驱动会正确地处理这些值,避免恶意输入导致的 SQL 注入问题。最后在成功查询到数据后,再使用 format!
构建最终展示的 SQL 字符串。