7个版本

0.1.6 2020年8月7日
0.1.5 2020年8月5日

#1793数据库接口

每月 45 次下载

MIT 许可证

5KB

🎯 Hesoyam ORM

MIT License Version Version

这只是Postgres和Clickhouse的另一个ORM。如果你觉得它有用,请给我们一个⭐ :)

安装

Cargo.toml:

[dependencies]
hesoyam = "0.1.6"

示例

首先让我们自定义模型。如果我们不传递表名作为宏参数,将生成默认值。假设表已经在数据库中创建。

model.rs 看起来像

#[model(dialect = "postgres", table_name = "users")]
pub struct User {
    pub name: String,
    pub age: i32,
    pub weight: f32,
}

现在我们应该提供数据库配置来开始工作

let pg_conf = PostgresConfig::new().
    host("loclahost").
    user("postgres").
    password("qwerty").
    port(5432).
    database("postgres");

let ch_conf = ClickhouseConfig::new().
    schema("http").
    hostname("localhost").
    port(8123);

let mut cm = ClientManager::new().
    add_client(&pg_conf)?.
    add_client(&ch_conf)?;

插入一条和多条记录

use hesoyam::prelude::*

// insert one entry
let name = String::from("Thomas");
let age = 20;

User::save(name, age).exec(&mut cm)?;

// do the same with multiple users
let users = vec![
    User { name: "John".to_owned(), age: 20 },
    User { name: "Tom".to_owned(), age: 30 },
    User { name: "Guido".to_owned(), age: 99 },
    User { name: "Rob".to_owned(), age: 199 },
    User { name: "Michael".to_owned(), age: 25 },
    User { name: "Jordan".to_owned(), age: 25 },
    User { name: "Raphael".to_owned(), age: 25 },
];

users.save().exec(&mut cm)?;

选择记录

请注意,From trait 由 #[model] 宏实现

let res = User::select().filter(vec![
    User::field_age.gte(&20),
    User::field_age.lte(&40),
]).exec(&mut cm)?;

for r in res {
    let u: User = r.into();

    println!("{:#?}", u);
}

原始查询

此外,还有 #[query_result] 宏来简化将原始查询结果转换为结构体的过程

let raw_query = r#"
    select
        entity_id,
        max(high) as max_high
    from market_quote
    group by entity_id
    order by entity_id;
"#;

#[query_result]
#[derive(Debug)]
struct Result {
    entity_id: i32,
    avg_high: f32,
}

let res = cm.
    get_client("clickhouse")?.
    query(raw_query)?;

for row in res {
    let res: Result = row.into();

    println!("{:#?}", res);
}

有关更多(更新/删除)信息,请参阅 示例 🙂

依赖项

~16–27MB
~418K SLoC