2 个不稳定版本

0.2.0 2024年5月13日
0.1.9 2023年12月8日

450数据库接口

Download history 133/week @ 2024-05-10 16/week @ 2024-05-17 2/week @ 2024-05-24

85 每月下载量

MIT/Apache

77KB
1.5K SLoC

基于 tiberius 的简单易用的 MS SQL Server 基础 ORM。

此 crate 仍在建设中,API 可能会发生变化。
有关完整文档,请访问 doc.rs

快速浏览

在定义结构体时,请确保字段顺序与数据库中的顺序一致,因为批量插入(insert_many)依赖于它。

use ssql::prelude::*;
use serde::{Deserialize, Serialize};

#[derive(ORM, Debug, Default, Serialize, Deserialize)]
#[ssql(table = Person, schema = SCHEMA1)] // other schema
struct Person {
    #[ssql(primary_key)]
    id: i32,
    email: Option<String>, // wrap nullable column in option
}

#[derive(ORM, Debug, Default, Serialize, Deserialize)]
#[ssql(table = Posts)] // default schema
struct Posts {
    id: i32,
    post: String,
    #[ssql(foreign_key = "SCHEMA1.Person.id")] // if it belongs to default schema, just write TABLE.COLUMN
    person_id: i32,
}

async fn _get<'a>(client: &'a mut tiberius::Client<Compat<TcpStream>>) -> SsqlResult<()> { 
    let mut query = Person::query();

    // return Vec<Person>
    let vec1 = query.all(client).await?;

    // return Vec<Value>
    let js = query.json(client).await?;

    // return Polars DataFrame
    let df = query.df(client).await?;

    // return Vec<(Person, Posts)>
    let query = query.left_join::<Posts>();
    let vec2 = query.all(client).await?;

    Ok(())
}

待办事项

  • 处理多对多关系
  • 构建过滤模式
  • 支持原始 SQL 字符串查询
  • 处理非手动输入键,如自动生成的 ID
  • 处理 GROUP BY 聚合
  • 支持装饰列的过滤,例如 WHERE YEAR(datetime_col) = ?

依赖关系

~8–20MB
~327K SLoC