我在本地使以下内容正常工作。当然,我没有你的数据库,但构建的 SQL 看起来是正确的。我只是选择了 postgres,因为你没有指定你实际使用的数据库。
use sqlx::{query_builder::QueryBuilder, Execute};
struct Search {
id: i64,
username: Option<String>,
min_age: Option<i8>,
max_age: Option<i8>,
}
fn search_query(search: Search) -> String {
let mut query = QueryBuilder::new("SELECT * from users where id = ");
query.push_bind(search.id);
if let Some(username) = search.username {
query.push(" AND username = ");
query.push_bind(username);
}
if let Some(min_age) = search.min_age {
query.push(" AND age > ");
query.push_bind(min_age);
}
if let Some(max_age) = search.max_age {
query.push(" AND age < ");
query.push_bind(max_age);
}
query.build().sql().into()
}
fn main() {
dbg!(search_query(Search {
id: 12,
username: None,
min_age: None,
max_age: None,
}));
dbg!(search_query(Search {
id: 12,
username: Some("Bob".into()),
min_age: None,
max_age: None,
}));
dbg!(search_query(Search {
id: 12,
username: Some("Bob".into()),
min_age: Some(10),
max_age: Some(70),
}));
}
我没有将id
参数设为可选的,但我相信如果没有提供参数,你可以想办法省略where
。
push
和push_bind
吗?还是你在手动处理字符串? - PitaJpush
和push_bind
不能用于构建形如“where field :condition value”的查询,特别是当谓词可以是可选的时候。 - Finlay Weberpush
或push_bind
的。即使是这样,这些只是一个常见用例的示例。请尝试一下。 - PitaJ