3 个版本
0.1.2 | 2021 年 10 月 21 日 |
---|---|
0.1.1 | 2021 年 10 月 18 日 |
0.1.0 | 2021 年 10 月 17 日 |
#2367 在 数据库接口
被 awto-compile 使用
23KB
592 行
什么是 awto?
Awto 将您的 Rust 项目视为微服务的可信来源,并根据您的模式和服务的 schema 生成 数据库表 和 protobuf。
数据库生成
- 数据库表是从您的 Rust 结构体生成的
- 您的结构体的更改将被检测并相应地修改表 schema
Protobuf 生成
- 从您的模型生成 protobuf schema
- 从您的应用程序的服务编译 protobuf 服务器
概念
使用 awto,您为每个微服务创建一个 Cargo 工作区。在您的 workspace 下,您创建两个库:**schema
** 和 **service
**
Schema
schema 库的目的是定义您的微服务模型,这些模型将被用来生成数据库表。
// schema/src/lib.rs
use awto::prelude::*;
schema! {
#[database_table]
#[protobuf_message]
pub struct Product {
pub id: Uuid,
pub created_at: DateTime<FixedOffset>,
pub updated_at: DateTime<FixedOffset>,
pub name: String,
#[awto(max_len = 120)]
pub description: Option<String>,
#[awto(default = 0)]
pub price: i64,
}
}
请参阅 examples/ecom
中的示例 schema。
Service
service 库是您编写业务逻辑的地方。这种业务逻辑可以后来用来创建 protobuf API(以及未来可能的 graphql API)。
// service/src/lib.rs
register_services!(ProductService);
pub struct ProductService {
pub conn: DatabaseConnection,
}
#[protobuf_service]
impl ProductService {
pub async fn find_by_id(&self, request: ProductId) -> Result<Product, Status> {
let product = product::Entity::find_by_id(request.id)
.one(&self.conn)
.await
.map_err(|err| Status::internal(err.to_string()))?
.ok_or_else(|| Status::not_found("product not found"))?;
Ok(product.into())
}
}
请参阅 examples/ecom
中的示例 service。
Cargo 工作区
您的 schema 和 service 库应该位于一个 Cargo 工作区下。
# root Cargo.toml
[workspace]
members = ["schema", "service"]
请参阅 examples/ecom
中的示例项目。
Awto CLI
Awto 提供了一个 CLI,用于使用 awto compile <lib>
命令生成额外的库。目前可用的库有
安装
您可以使用以下命令安装 CLI
cargo install awto-cli
这将提供一个名为 awto
的二进制文件。
使用 awto --help
检查安装。
编译库
要编译库,您可以运行
awto compile <output>
目前可用的输出有
database
- 同步您的数据库与 schema,并生成一个库,通过 SeaORM 执行数据库操作。protobuf
- 生成protobuf文件和库,可用于通过tonic作为protobuf服务器和客户端。
路线图
Awto目前仍处于alpha阶段,目前主要是作为一个实验。如果它得到一些关注,将会投入更多努力使其成为Rust社区的一个有意义的工具。
贡献
无论您想分享想法、错误、建议还是其他,都欢迎您为此项目做出贡献 🤌
许可协议
通过贡献,您同意您的贡献将按照此存储库的MIT或Apache-2.0许可协议进行许可。
依赖项
~9.5MB
~164K SLoC