#sqlite #orm #mysql

akita

Akita - Rust 的迷你 ORM

34 个版本

0.4.3 2022 年 9 月 7 日
0.4.0 2022 年 7 月 27 日
0.3.8 2021 年 12 月 27 日
0.3.2 2021 年 11 月 29 日
0.1.5 2021 年 7 月 13 日

#568 in 数据结构

Download history 7/week @ 2024-03-28 2/week @ 2024-04-04 10/week @ 2024-04-11 4/week @ 2024-04-18

97 每月下载量

MIT 许可证

365KB
8K SLoC

Akita   构建状态 最新版本 akita: rustc 1.13+ akita_derive: rustc 1.31+

Akita-迷你 ORM用于rust

此包提供

  • MySql 数据库的纯 Rust 辅助工具;
  • SQLite 数据库的纯 Rust 辅助工具;
  • 一个迷你 ORM 框架(包含 MySQL/SQLite)。

特性

  • 其他数据库支持,例如支持 Oracle, MSSQL...;
  • 支持自定义条件的命名参数;

你可能还在寻找

Akita 应用

点击显示 Cargo.toml. 在此 playground 中运行此代码。
[dependencies]

# The core APIs, including the Table traits. Always
# required when using Akita. using #[derive(AkitaTable)] 
# to make Akita work with structs defined in your crate.
akita = { version = "0.4.0", features = ["akita-mysql"] }

API 文档

use akita::*;

/// Annotion Support: AkitaTable、table_id、field (name, exist, fill(function, mode))
#[derive(AkitaTable, Clone, Default)]
#[table(name = "t_system_user")]
pub struct User {
    #[table_id(name = "id")]
    pub pk: i64,
    pub id: String,
    pub headline: Option<NaiveDateTime>,
    /// 状态
    pub status: u8,
    /// 用户等级 0.普通会员 1.VIP会员
    pub level: u8,
    /// 生日
    pub birthday: Option<NaiveDate>,
    /// 性别
    pub gender: u8,
    #[field(exist = "false", fill="is_org_build")]
    pub is_org: bool,
    #[field(name = "token", fill(function = "token_build", mode="default"))]
    pub url_token: String,
}

static area: &str = "china"; 

fn is_org_build() -> bool {
    area.eq("china")
}

fn token_build() -> String {
    // generate the token
    todo!()
}

使用 Akita 进行 CRUD



fn main() {
    let cfg = AkitaConfig::new(String::from("mysql://root:password@localhost:3306/akita"))
        .set_connection_timeout(Duration::from_secs(6))
        .set_log_level(LogLevel::Info).set_max_size(6);
    let akita = Akita::new(cfg).expect("must be ok");
    // The Wrapper to build query condition
    let wrapper = Wrapper::new()
        .eq("username", "ussd") // username = 'ussd'
        .gt("age", 1) // age > 1
        .lt("age", 10) // age < 10
        .inside("user_type", vec!["admin", "super"]) // user_type in ('admin', 'super')
        .and(|wrapper| { // or
            wrapper.like("username", &name)
                .or_direct().like("username", &name)
        });
    // CRUD with Akita
    let insert_id: Option<i32> = akita.save(&User::default()).unwrap();
    let _ = akita.save_batch(&[&User::default()]).unwrap();
    // Update with wrapper
    let res = akita.update(&User::default(), Wrapper::new().eq("name", "Jack")).unwrap();
    // Update with primary id
    let res = akita.update_by_id(&User::default());
    // Query return List
    let list: Vec<User> = akita.list(Wrapper::new().eq("name", "Jack")).unwrap();
    // Query return Page
    let pageNo = 1;
    let pageSize = 10;
    let page: IPage<User> = akita.page(pageNo, pageSize, Wrapper::new().eq("name", "Jack")).unwrap();
    // Remove with wrapper
    let res = akita.remove::<User>(Wrapper::new().eq("name", "Jack")).unwrap();
    // Remove with primary id
    let res = akita.remove_by_id::<User,_>(0).unwrap();
    // Get the record count
    let count = akita.count::<User>(Wrapper::new().eq("name", "Jack")).unwrap();
    // Query with original sql
    let user: User = akita.exec_first("select * from t_system_user where name = ? and id = ?", ("Jack", 1)).unwrap();
    // Or
    let user: User = akita.exec_first("select * from t_system_user where name = :name and id = :id", params! {
        "name" => "Jack",
        "id" => 1
    }).unwrap();
    let res = akita.exec_drop("select now()", ()).unwrap();

    // Transaction
    akita.start_transaction().and_then(|mut transaction| {
        let list: Vec<User> = transaction.list(Wrapper::new().eq("name", "Jack"))?;
        let insert_id: Option<i32> = transaction.save(&User::default())?;
        transaction.commit()
    }).unwrap();
}

使用实体进行 CRUD



fn main() {
    let cfg = AkitaConfig::new(String::from("mysql://root:password@localhost:3306/akita"))
        .set_connection_timeout(Duration::from_secs(6))
        .set_log_level(LogLevel::Info).set_max_size(6);
    let akita = Akita::new(cfg).expect("must be ok");
    // CRUD with Entity
    let model = User::default();
    // insert
    let insert_id = model.insert::<Option<i32>, _>(&akita).unwrap();
    // update
    let res = model.update_by_id::<_>(&akita).unwrap();
    // delete
    let res = model.delete_by_id::<i32,_>(&akita, 1).unwrap();
    // list
    let list = User::list::<_>(Wrapper::new().eq("name", "Jack"), &akita).unwrap();
    // page
    let page = User::page::<_>(pageNo, pageSize, Wrapper::new().eq("name", "Jack"), &akita).unwrap();
}

使用 SQL 快速



fn main() {
    pub static AK:Lazy<Akita> = Lazy::new(|| {
        let mut cfg = AkitaConfig::new("xxxx".to_string()).set_max_size(5).set_connection_timeout(Duration::from_secs(5)).set_log_level(LogLevel::Info);
        Akita::new(cfg).unwrap()
    });
    
    #[sql(AK,"select * from mch_info where mch_no = ?")]
    fn select_example(name: &str) -> Vec<MchInfo> { todo!() }
        
    // or:
    #[sql(AK,"select * from mch_info where mch_no = ?")]
    fn select_example2(ak: &AKita, name: &str) -> Vec<MchInfo> { todo!() }
    // ...
    
}

包装器


let mut wrapper = Wrapper::new().like(true, "column1", "ffff")
.eq(true, "column2", 12)
.eq(true, "column3", "3333")
.inside(true, "column4", vec![1,44,3])
.not_between(true, "column5", 2, 8)
.set(true, "column1", 4);

特性。

  • akita-mysql - 使用 mysql
  • akita-sqlite - 使用 sqlite
  • akita-auth - 使用某些认证方法
  • akita-fuse - 使用某些 fuse 功能

注释。

  • AkitaTable - 使 Akita 与结构体协同工作
  • FromValue - 使用 akita 从值
  • ToValue - 使用 akita 到值
  • table_id - 创建表标识符
  • field - 创建具有自己的数据库的结构体字段
  • name - 与列一起工作,使表的字段名。默认为结构体的字段名。
  • exist - 忽略结构体中的字段与表。默认为 true。

支持字段类型。

  • Option<T>
  • u8, u32, u64
  • i32, i64
  • usize
  • bool
  • f32, f64
  • str, String
  • serde_json::Value
  • NaiveDate,NaiveDateTime

开发

要设置开发环境,请运行 cargo run

贡献者

MrPan <1049058427@qq.com>

获取帮助

阿基拉是一个个人项目。最初,我只是因为我的爱好喜欢阿基拉狗。我希望这个项目会越来越可爱。未来将添加许多实用的数据库功能。希望您能积极参与这个项目的发展并提出建议。我相信未来会越来越好。


许可证

根据您的选择,许可协议为Apache许可证,版本2.0MIT许可证
除非您明确表示,否则根据Apache-2.0许可证的定义,您有意提交给阿基拉的所有贡献都将按照上述方式双许可,没有任何附加条款或条件。

依赖项

~8–25MB
~395K SLoC