#sql #sql-database #orm #postgresql #async #compile-time

nightly gorm

一个简单易用且在编译时防止所有错误的 ORM

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 / 数据库接口

GPL-3.0-only

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