| Crates.io | sqlx-query-dsl |
| lib.rs | sqlx-query-dsl |
| version | 0.1.1 |
| created_at | 2026-01-02 22:11:01.753727+00 |
| updated_at | 2026-01-02 22:22:46.301903+00 |
| description | A query DSL extension for SQLx |
| homepage | |
| repository | https://github.com/NewBreach26/sqlx-query-dsl |
| max_upload_size | |
| id | 2019271 |
| size | 82,088 |
这是一个基于 sqlx (MySQL) 的动态查询构建工具库。它允许通过 JSON 结构定义复杂的查询条件(包括嵌套的 AND/OR 逻辑),并提供了安全的分页查询封装。
FieldWhitelist) 机制,严格校验字段名,防止 SQL 注入。AND / OR 逻辑嵌套。COUNT(*) 查询和分页 LIMIT/OFFSET 计算。QueryParams 设计用于直接反序列化前端传入的 JSON。在你的 Cargo.toml 中添加:
[dependencies]
sqlx-query-dsl = { path = "." } # 或者指向你的 git 仓库/crates.io 版本
sqlx = { version = "0.8", features = ["mysql", "runtime-tokio-rustls"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
use sqlx::FromRow;
use serde::Serialize;
#[derive(Debug, Serialize, FromRow)]
pub struct User {
pub id: i32,
pub name: String,
pub email: String,
pub role: String,
pub active: bool,
}
use sqlx_query_dsl::params::QueryParams;
use sqlx_query_dsl::whitelist::FieldWhitelist;
use sqlx_query_dsl::page::query_page;
use sqlx::MySqlPool;
async fn list_users(pool: &MySqlPool, params: QueryParams) -> Result<(), sqlx::Error> {
// 1. 定义允许过滤和排序的字段(白名单)
let allowed_fields = &["name", "email", "role", "active", "created_at"];
let whitelist = FieldWhitelist::new(allowed_fields);
// 2. 定义基础 SQL
let base_sql = "SELECT * FROM users";
let count_sql = "SELECT COUNT(*) FROM users";
// 3. 执行查询
// query_page 会自动处理 WHERE 子句的构建和参数绑定
let page_result = query_page::<User>(
pool,
base_sql,
count_sql,
params,
whitelist
).await?;
println!("总记录数: {}", page_result.total);
for user in page_result.list {
println!("{:?}", user);
}
Ok(())
}
前端发送的 JSON 请求体示例:
{
"page": 0,
"page_size": 10,
"sort": [
{ "field": "created_at", "desc": true }
],
"filter": {
"and": [
{
"field": "role",
"op": "eq",
"value": "admin"
},
{
"or": [
{ "field": "active", "op": "eq", "value": true },
{ "field": "name", "op": "like", "value": "Alice" }
]
}
]
}
}
| 操作符 | SQL 映射 | 说明 |
|---|---|---|
eq, ne |
=, != |
相等/不相等 |
like |
LIKE |
模糊匹配 (自动包裹 %value%) |
gt, lt |
>, < |
大于/小于 |
gte, lte |
>=, <= |
大于等于/小于等于 |
in, not_in |
IN, NOT IN |
列表包含 |
between |
BETWEEN |
范围查询 (需传入数组 [min, max]) |
is_null, is_not_null |
IS NULL |
空值检查 |
json_contains |
JSON_CONTAINS |
JSON 字段查询 |