Akita
Akita - Mini orm for rust
This create offers:
- MySql database's helper in pure rust;
- SQLite database's helper in pure rust;
- A mini orm framework (With MySQL/SQLite)。
Features:
- Other Database support, i.e. support Oracle, MSSQL...;
- support of named parameters for custom condition;
You may be looking for:
Akita in action
[dependencies]
akita = { version = "0.3.0", features = ["akita-mysql"] }
API Documentation
use akita::*;
use akita::prelude::*;
#[derive(AkitaTable, Clone, Default, ToValue, FromValue)]
#[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,
pub level: u8,
pub birthday: Option<NaiveDate>,
pub gender: u8,
#[field(exist = "false")]
pub is_org: bool,
#[field(name = "token")]
pub url_token: String,
}
CRUD with EntityManager
fn main() {
let db_url = String::from("mysql://root:password@localhost:3306/akita");
let cfg = AkitaConfig::new(db_url).set_connection_timeout(Duration::from_secs(6))
.set_log_level(LogLevel::Debug).set_max_size(6);
let mut pool = Pool::new(cfg).expect("must be ok");
let mut entity_manager = pool.entity_manager().expect("must be ok");
let wrapper = Wrapper::new()
.eq("username", "ussd") .gt("age", 1) .lt("age", 10) .inside("user_type", vec!["admin", "super"]); let insert_id: Option<i32> = entity_manager.save(&User::default()).unwrap();
let insert_ids: Vec<Option<i32>>= entity_manager.save_batch(&[&User::default()]).unwrap();
let res = entity_manager.update(&User::default(), Wrapper::new().eq("name", "Jack")).unwrap();
let res = entity_manager.update_by_id(&User::default());
let list: Vec<User> = entity_manager.list(Wrapper::new().eq("name", "Jack")).unwrap();
let pageNo = 1;
let pageSize = 10;
let page: IPage<User> = entity_manager.page(pageNo, pageSize, Wrapper::new().eq("name", "Jack")).unwrap();
let res = entity_manager.remove::<User>(Wrapper::new().eq("name", "Jack")).unwrap();
let res = entity_manager.remove_by_id::<User,_>(0).unwrap();
let count = entity_manager.count::<User>(Wrapper::new().eq("name", "Jack")).unwrap();
let user: User = entity_manager.execute_first("select * from t_system_user where name = ? and id = ?", ("Jack", 1)).unwrap();
let user: User = entity_manager.execute_first("select * from t_system_user where name = :name and id = :id", params! {
"name" => "Jack",
"id" => 1
}).unwrap();
let res = entity_manager.execute_drop("select now()", ()).unwrap();
}
CRUD with Entity
fn main() {
let db_url = String::from("mysql://root:password@localhost:3306/akita");
let cfg = AkitaConfig::new(db_url).set_connection_timeout(Duration::from_secs(6))
.set_log_level(LogLevel::Debug).set_max_size(6);
let mut pool = Pool::new(cfg).expect("must be ok");
let mut entity_manager = pool.entity_manager().expect("must be ok");
let model = User::default();
let insert_id = model.insert::<Option<i32>, _>(&mut entity_manager).unwrap();
let res = model.update_by_id::<_>(&mut entity_manager).unwrap();
let res = model.delete_by_id::<i32,_>(&mut entity_manager, 1).unwrap();
let list = User::list::<_>(Wrapper::new().eq("name", "Jack"), &mut entity_manager).unwrap();
let page = User::page::<_>(pageNo, pageSize, Wrapper::new().eq("name", "Jack"), &mut entity_manager).unwrap();
}
Fast with Akita
fn main() {
let db_url = String::from("mysql://root:password@localhost:3306/akita");
let cfg = AkitaConfig::new(db_url).set_connection_timeout(Duration::from_secs(6))
.set_log_level(LogLevel::Debug).set_max_size(6);
let mut pool = Pool::new(cfg).expect("must be ok");
let mut entity_manager = pool.entity_manager().expect("must be ok");
let list: Vec<User> = Akita::new().conn(pool.database().unwrap())
.table("t_system_user")
.wrapper(Wrapper::new().eq("name", "Jack"))
.list::<User>().unwrap();
let page: IPage<User> = Akita::new().conn(pool.database().unwrap())
.table("t_system_user")
.wrapper(Wrapper::new().eq("name", "Jack"))
.page::<User>(1, 10).unwrap();
}
Wrapper
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);
Feature.
akita-mysql
- to use mysql
akita-sqlite
- to use sqlite
akita-auth
- to use some auth mehod
Annotions.
AkitaTable
- to make Akita work with structs
FromValue
- from value with akita
ToValue
- to value with akita
table_id
- to make Table Ident
field
- to make struct field with own database.
name
- work with column, make the table's field name. default struct' field name.
exist
- ignore struct's field with table. default true.
Support Field Types.
Option<T>
u8, u32, u64
i32, i64
usize
bool
f32, f64
str, String
serde_json::Value
NaiveDate, NaiveDateTime
Developing
To setup the development envrionment run cargo run
.
Contributers
MrPan <1049058427@qq.com>
Getting help
Akita is a personal project. At the beginning, I just like Akita dog because of my hobbies.
I hope this project will grow more and more lovely. Many practical database functions will
be added in the future. I hope you can actively help this project grow and put forward suggestions.
I believe the future will be better and better.
License