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>

对于与其他模型相关的模型,还会实现额外的函数。以UserCredentials为例,以下内容会提供

// 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