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.2 | 2023年7月1日 |
#233 在 数据库接口
每月274次下载
2MB
1.5K SLoC
概述
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在编译时内省User
和Post
结构,并将有关架构的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