10个不稳定版本 (3个破坏性版本)

0.3.0 2024年6月29日
0.2.0 2024年4月23日
0.1.3 2023年12月7日
0.1.1 2023年11月25日
0.0.1-alpha.22023年7月1日

#233数据库接口

Download history 172/week @ 2024-04-19 28/week @ 2024-04-26 11/week @ 2024-05-03 7/week @ 2024-05-10 16/week @ 2024-05-17 10/week @ 2024-05-24 51/week @ 2024-05-31 87/week @ 2024-06-07 11/week @ 2024-06-14 160/week @ 2024-06-28 40/week @ 2024-07-05 8/week @ 2024-07-12 218/week @ 2024-07-26 46/week @ 2024-08-02

每月274次下载

Apache-2.0

2MB
1.5K SLoC

Atmosphere

🌍 Atmosphere

适用于可持续数据库依赖系统的轻量级SQL框架

SQLx Crate Book Docs

概述

Atmosphere是一个轻量级的SQL框架,专为可持续的数据库依赖系统设计。它利用Rust强大的类型和宏系统,从Rust结构定义派生出SQL架构到高级特质系统。

主要特性

  • 从Rust结构推导SQL架构。
  • 用于查询生成的先进特质系统。
  • 使用atmosphere::testing自动进行数据库代码测试。
  • 类似于ORM的CRUD特质。
  • 使用泛型在API层之间实现代码复用。
  • 编译时内省以生成类型安全的架构。

快速入门

use atmosphere::prelude::*;

#[derive(Schema)]
#[table(schema = "public", name = "user")]
struct User {
    #[sql(pk)]
    id: i32,
    name: String,
    #[sql(unique)]
    email: String,
}

#[derive(Schema)]
#[table(schema = "public", name = "post")]
struct Post {
    #[sql(pk)]
    id: i32,
    #[sql(fk -> User, rename = "author_id")]
    author: i32,
    #[sql(unique)]
    title: String,
}

#[tokio::main]
async fn main() -> sqlx::Result<()> {
    let pool = atmosphere::Pool::connect(&std::env::var("DATABASE_URL").unwrap()).await?;

    // CRUD operations

    let user = User { id: 0, name: "demo".to_owned(), email: "[email protected]".to_owned(), };

    user.save(&pool).await?;
    user.delete(&pool).await?;
    user.create(&pool).await?;

    // Field Queries

    assert_eq!(
        User::read(&pool, &0).await?,
        User::find_by_email(&pool, "[email protected]").await?.unwrap()
    );

    // Relationships

    Post { id: 0, author: 0, title: "test".to_owned() }
        .save(&pool)
        .await?;

    Post::find_by_author(&pool, &0).await?;
    Post::delete_by_author(&pool, &0).await?;

    // Inter-Table Operations

    Post { id: 1, author: 0, title: "test1".to_owned() }
        .author(&pool).await?;

    user.posts(&pool).await?;
    user.delete_posts(&pool).await?;

    Ok(())
}

Atmosphere在编译时内省UserPost结构,并将有关架构的const类型信息生成到Table特质中。

路线图

alpha版本发布

  • 高级SQL特质系统 (Table, Column, Relation ..)
  • 派生宏 (Schema)
  • SQL字段属性 (#[sql(pk)], #[sql(fk -> Model)]等等)
  • SQL查询生成
  • 自动集成测试
  • 属性宏 (#[table])

beta版本发布

  • 事务支持
  • 实现数据库无关性
  • 使用 atmosphere::hooks 钩入查询执行
  • 使用 miette 时出现的错误
  • 组合主键和外键

稳定版

  • Postgres 组合类型
  • 支持自定义类型
  • 运行时检查
  • 提供应用实用工具
  • 稳定特性
  • 稳定查询生成
  • 表透镜(子集/视图)
  • 支持 validator
  • 自动时间戳

高级功能

  • 使用 #[virtual = "<sql>"] 使用虚拟列
  • 软删除支持
  • 属性宏(#[query]
  • 自定义查询

长期支持

  • 生成 GraphQL + HTTP 服务器?
  • 生成图谱

功能

给定一个通过 #[derive(Schema)]#[table] 导出其 atmosphere 架构的 struct Model

use atmosphere::prelude::*;

#[derive(Schema)]
#[table(schema = "public", name = "model")]
struct Model {
    #[sql(pk)]
    id: i32,
    a: String,
    #[sql(unique)]
    b: String,
}

Atmosphere 能够推导并生成以下查询

CRUD

atmosphere::创建

  • 模型::创建

atmosphere::读取

  • Model::read:通过主键读取 Model,返回一个 Model
  • Model::find:通过主键查找 Model,返回一个 Option<Model>
  • Model::read_all:读取所有 Model,返回一个 Vec<Model>
  • 模型::重新加载

atmosphere::更新

  • 模型::更新
  • 模型::更新/插入

atmosphere::删除

  • 模型::删除
  • 模型::根据字段删除

字段查询

每个标记为 #[sql)(unique)] 的结构字段都变得可查询。

在上面的示例中,b 被标记为唯一,因此 atmosphere 实现了

  • Model::find_by_b:通过 b 字段查找 Model,返回一个 Option<Model>
  • Model::delete_by_b:通过 b 字段删除 Model

关系和跨表查询

假设一个模型包含的字段被标记为外键/指向另一个 atmosphere::Table,例如

#[derive(Schema)]
#[table(schema = "public", name = "submodel")]
struct Submodel {
    #[sql(pk)]
    id: i32,
    #[sql(fk -> Model)]
    super: i32,
}

大气层能够生成查询以跨过 边界

  • 模型::子模型
  • 模型::删除子模型
  • 子模型::模型
  • 子模型::按模型查找
  • 子模型::按模型删除

注意,函数名包含 模型子模型 – 它们是从相应的结构体名称派生出来的。

贡献

我们欢迎贡献!请参阅我们的贡献指南以获取更多详细信息。

许可证

大气层采用Apache 2.0许可证。

依赖项

~47MB
~815K SLoC