#sql-query #compile-time #orm #proc-macro #sqlx #toolkit #dynamic

dysql-core

Dysql 是一个使用 proc-macro 进行动态 SQL 查询的 Rust crate,它基于 sqlx crate 构建。

3 个版本 (1 个稳定版)

2.0.0 2024年4月3日
0.11.0 2023年10月30日
0.10.0 2023年10月30日

#2982数据库接口

Download history 7/week @ 2024-04-09 9/week @ 2024-05-21 1/week @ 2024-05-28 6/week @ 2024-06-04

每月下载量 142
用于 2 crates

GPL-3.0 许可

270KB
6.5K SLoC

关于 Dysql

Dysql 是一个高性能的 Rust SQL 工具包和 ORM 库。它是一个异步的、纯 Rust 的 SQL crate,具有编译时动态 SQL 特性。是一个高性能轻量级的基于 Rust 的异步 ORM 库,它提供编译时的动态 SQL。

它基于 sqlx、rbac、tokio-postgres 等底层库,提供了一个类似于 ibatis 的动态 SQL 模板语言,用于生成动态 SQL,支持 CRUD 和分页。

该模板语言的使用规则如下

dysql_macro_name!(| conn_or_tran, dto | [-> return_type ] { ...sql string... });

实例

Cargo.toml

[dependencies]
dysql = "2"
sqlx = { version = "0.7", features = [ "runtime-tokio-native-tls" , "postgres" ] }
tokio = { version = "1.0", features = ["full"] }

main.rs


use std::error::Error;

use dysql::{PageDto, SortModel, sql, fetch_one, insert, fetch_scalar, execute, page, fetch_all, Value};
use sqlx::{Pool, MySql, mysql::MySqlPoolOptions};
use dysql::Content;
use sqlx::FromRow;

use crate::common::{UserDto, User};

#[derive(Content, Clone)]
pub struct UserDto {
    pub id: Option<i64>,
    pub name: Option<String>,
    pub age: Option<i32>,
    pub id_rng: Option<Vec<i32>>,
}

#[allow(dead_code)]
impl UserDto {
    pub fn new(id: Option<i64>, name: Option<String>, age: Option<i32>, id_rng: Option<Vec<i32>>) -> Self {
        Self { id, name, age, id_rng }
    }
}

#[allow(dead_code)]
#[derive(Debug, PartialEq)]
#[derive(FromRow)]
pub struct User {
    pub id: i64,
    pub name: Option<String>,
    pub age: Option<i32>,
}

pub async fn connect_mysql_db() -> Pool<MySql> {
    let conn = MySqlPoolOptions::new()
        .max_connections(5)
        .connect("mysql://root:[email protected]/my_database").await.unwrap();

    conn
}

#[tokio::main]
async fn main() {
    let conn = connect_mysql_db().await;

    let dto = UserDto{ id: None, name: None, age: Some(13) , id_rng: None };
    let rst = fetch_all!(|&conn, &dto| -> User {
        r#"SELECT * FROM test_user 
        WHERE 1 = 1
          {{#name}}AND name = :name{{/name}}
          {{#age}}AND age > :age{{/age}}
        ORDER BY id"#
    }).unwrap();
    assert_eq!(7, rst.len());

    let rst = fetch_all!(|&conn| -> User {
        r#"SELECT * FROM test_user"#
    }).unwrap();
    rst!("{}", rst.len());
}

许可证

Dysql 是免费软件,并按照 Apache License 2.0 许可协议发布。请参阅 LICENSE

依赖

~5–22MB
~298K SLoC