#query-builder #mysql #query #builder #rust

chain-builder

为 Rust 设计的 MySQL 查询构建器,旨在灵活且易于使用

24 个版本

0.1.25 2024 年 8 月 23 日
0.1.24 2024 年 4 月 2 日
0.1.23 2024 年 2 月 29 日
0.1.9 2024 年 1 月 14 日

#657数据库接口

Download history 8/week @ 2024-06-28 66/week @ 2024-07-05 94/week @ 2024-07-26 14/week @ 2024-08-02

每月 108 次下载

MIT 许可证

53KB
1.5K SLoC

链构建器

Documentation Version License

为 Rust 设计的 MySQL 查询构建器,旨在灵活且易于使用。

安装

cargo add chain-builder

用法

use chain_builder::{ChainBuilder, Select, WhereClauses, Client};
use serde_json::{self, Value};

let mut builder = ChainBuilder::new(Client::Mysql);
builder.db("mydb"); // For dynamic db
builder.select(Select::Columns(vec!["*".into()]));
builder.table("users");
builder.query(|qb| {
    qb.where_eq("name", Value::String("John".to_string()));
    qb.where_eq("city", Value::String("New York".to_string()));
    qb.where_in(
        "department",
        vec![
            Value::String("IT".to_string()),
            Value::String("HR".to_string()),
        ],
    );
    qb.where_subquery(|sub| {
        sub.where_eq("status", Value::String("active".to_string()));
        sub.or()
            .where_eq("status", Value::String("pending".to_string()))
            .where_between(
                "registered_at",
                [
                    Value::String("2024-01-01".to_string()),
                    Value::String("2024-01-31".to_string()),
                ],
            );
    });
    qb.where_raw(
        "(latitude BETWEEN ? AND ?) AND (longitude BETWEEN ? AND ?)".into(),
        Some(vec![
            Value::Number(serde_json::Number::from_f64(40.0).unwrap()),
            Value::Number(serde_json::Number::from_f64(41.0).unwrap()),
            Value::Number(serde_json::Number::from_f64(70.0).unwrap()),
            Value::Number(serde_json::Number::from_f64(71.0).unwrap()),
        ]),
    );
});
let sql = builder.to_sql();
println!("final sql: {}", sql.0);
// SELECT * FROM mydb.users WHERE name = ? AND city = ? AND department IN (?,?) AND (status = ? OR (status = ? AND registered_at BETWEEN ? AND ?)) AND (latitude BETWEEN ? AND ?) AND (longitude BETWEEN ? AND ?)
println!("final binds: {:?}", sql.1);
// Some([String("John"), String("New York"), String("IT"), String("HR"), String("active"), String("pending"), String("2024-01-01"), String("2024-01-31"), Number(40.0), Number(41.0), Number(70.0), Number(71.0)])

依赖项

~8–19MB
~292K SLoC