1个不稳定版本
0.1.0 | 2022年7月28日 |
---|
#133 在 #sql-database
22KB
335 行
Elucify
Elucify是一个简单的Postgres ORM,适用于使用Rocket的Rust应用程序。
描述
目前,该项目支持将基于Rust的模型与现有的Postgres数据库集成。它支持在创建、读取、过滤、更新、删除、转换为JSON以及轻松查询相关模型时处理模型。
灵感
Elucify主要是由于我发现大多数建立良好、健壮的Rust ORM并没有提供我在其他语言的ORM中看到的高层次易用性。主要,我想要一种可以抽象出SQL逻辑,并允许用户直接使用宏提供的函数实现的Rust结构体。
用法
首先,在crate级别必须定义一个Db
结构体,如下例所示,来自Rocket文档
use rocket_db_pools::{sqlx, Database};
#[derive(Database)]
#[database("sqlite_logs")]
pub struct Logs(sqlx::SqlitePool);
#[launch]
fn rocket() -> _ {
rocket::build().attach(Logs::init())
}
创建模型
接下来,模型可以像这样轻松地在任何地方定义
#[model]
pub struct User {
pub username: String,
pub email: String,
pub created_at: DateTime<Utc>,
pub last_login: DateTime<Utc>,
}
#[model(table = "credentials")]
#[derive(Related)]
pub struct Credentials {
#[foreign(type = "User")]
pub user_id: i32,
pub password: String,
}
请注意,省略了id
列,因为它会被隐式添加。具有外键(如user_id
)的结构体必须派生自Related
。默认情况下,表名与小写结构体名称相同,并在末尾附加's',因此User
引用表users
。
模型功能
当在Elucify中创建模型时,以下函数会提供
// Return table name (such as "users")
table() -> &'static str
// Find the model in the database with given id
find(id: i32, mut db: Connection<Db>) -> (Option<Self>, Connection<Db>)
// Find the first model with some field constraint
find_where(field: &str, value: &String, mut db: Connection<Db>) -> (Option<Self>, Connection<Db>)
// Identical to find(i32, Connection<Db>)
read(id: i32, mut db: Connection<Db>) -> (Option<Self>, Connection<Db>)
// Delete a record from the database
delete(id: i32, mut db: Connection<Db>) -> (Result<u64, Error>, Connection<Db>)
// Construct a new model record from given data
new(...fields) -> Self
// Insert or update a record to the database
save(&self, mut db: Connection<Db>) -> (Option<Self>, Connection<Db>)
// Convert a model record to JSON
json(self) -> rocket::serde::json::Json<Self>
对于与其他模型相关的模型,还会实现额外的函数。以User
和Credentials
为例,以下内容会提供
// Get all credentials records that reference this user
user.find_credentials(&self, mut db: Connection<Db>) -> (Vec<Credentials>, Connection<Db>)
// Get the user record associated with these credentials
credentials.get_user(&self, mut db: Connection<Db>) -> (Option<User>, Connection<Db>)
未来工作
该项目处于基本形式,是从我正在工作的另一个项目的一个子集创建的。将来,我计划允许Elucify使用任何数据库格式,并且不依赖于rocket::serde
进行JSON转换。
依赖关系
~2.5MB
~52K SLoC