sqlx 有一个查询生成器。文档可以在这里查看
我看到它支持动态构建以下形式的查询:
SELECT * FROM users WHERE (id, username) IN ((1, "test_user_1"), (2, "test_user_2"))
Run Code Online (Sandbox Code Playgroud)
但我有兴趣构建更复杂的查询,例如
SELECT * from users where id = "id" AND username = "username" AND age > "10" AND age < "70" AND last_visited < 12324235435 AND last_visited > 214324324234234
Run Code Online (Sandbox Code Playgroud)
其中任何 where 子句都是可选的。所以以下也应该动态构建
SELECT * from users where id = "id" AND age > "10" AND last_visited < 12324235435
Run Code Online (Sandbox Code Playgroud)
除了必须自己手动连接 where 字符串之外,我似乎找不到使用 sqlx 执行此操作的方法
Pit*_*taJ 16
我在本地工作了以下内容。当然,我没有你的数据库,但构建的 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,
})); // "SELECT * from users where id = $1"
dbg!(search_query(Search {
id: 12,
username: Some("Bob".into()),
min_age: None,
max_age: None,
})); // "SELECT * from users where id = $1 AND username = $2"
dbg!(search_query(Search {
id: 12,
username: Some("Bob".into()),
min_age: Some(10),
max_age: Some(70),
})); // "SELECT * from users where id = $1 AND username = $2 AND age > $3 AND age < $4"
}
Run Code Online (Sandbox Code Playgroud)
我没有做出可选的,但我相信如果没有提供参数,id
您可以弄清楚如何完全省略。where
归档时间: |
|
查看次数: |
6090 次 |
最近记录: |