5 个版本
0.1.4 | 2022年8月11日 |
---|---|
0.1.3 | 2022年8月11日 |
0.1.2 | 2022年8月10日 |
0.1.1 | 2022年8月10日 |
0.1.0 | 2022年8月9日 |
2824 / 数据库接口
155KB
3.5K SLoC
gorm
一个简单易用且在编译时防止所有错误的 ORM。
这是通过将 SQL 逻辑编码到 Rust 的丰富类型系统中实现的。
示例
有关如何使用此 crate 的更多信息,请参阅文档。
lib.rs
:
一个简单易用且通过使用 Rust 的丰富类型系统在编译时强制执行 SQL 逻辑来防止运行时错误的 ORM。
用法
此 crate 的核心是 Table
derive 宏,您可以在您的 Rust 结构体上使用它来告诉 ORM 它们代表数据库中的表。
示例
#[derive(Debug, Table)]
pub struct Person {
id: i32,
name: String,
age: i32,
#[table(foreign_key(School))]
school_id: i32,
}
#[derive(Debug, Table)]
pub struct School {
id: i32,
name: String,
}
struct MyMigration;
migration! { MyMigration => school, person }
let pool =
DatabaseConnectionPool::connect("postgres://postgres:postgres@localhost/some_database")
.await?;
MyMigration::down(&pool).await?;
MyMigration::up(&pool).await?;
let school_id = school::new { name: "Stanford" }
.insert_returning_value(returning!(school::id), &pool)
.await?;
person::new {
name: "James",
age: &35,
school_id,
}
.insert(&pool)
.await?;
#[derive(FromQueryResult)]
struct PersonNameAndSchoolName {
person_name: String,
school_name: String,
}
let person_and_school_names = person::table
.inner_join(school::table)
.find()
.select(select_values!(
person::name as person_name,
school::name as school_name
))
.load_all::<PersonNameAndSchoolName>(&pool)
.await?;
struct AgeSumOfSchool {
school_name: String,
age_sum: i64,
}
let age_sum_of_each_school_from_highest_to_lowest = person::table
.inner_join(school::table)
.find()
.select(select_values!(
school::name as school_name,
person::age.sum() as age_sum
))
.group_by(school::id)
.order_by_selected_value_descending(selected_value_to_order_by!(age_sum))
.load_all::<AgeSumOfSchool>(&pool)
.await?;
let old_enough_people_ids = person::table
.find()
.filter(person::age.greater_equals(20))
.select(select_values!(person::id))
.load_all_values(&pool)
.await?;
有关更多示例,请参阅示例目录。
迁移 CLI
如果您想创建一个用于管理迁移的 CLI,您可以使用 migration_cli
功能标志。此功能标志将提供 migration_cli_main
函数,您可以在主函数中调用它,它将处理其余部分。
有关此示例,请参阅示例目录中的 migration_cli
示例。
依赖关系
~8–19MB
~275K SLoC