5 releases
0.1.6 | May 17, 2024 |
---|---|
0.1.5 | Mar 18, 2024 |
0.1.3 | Nov 13, 2023 |
0.1.2 | Oct 31, 2023 |
0.1.1 | Oct 29, 2023 |
#2859 in Database interfaces
156 downloads per month
Used in anorm
33KB
497 lines
Implement Create, Read, Update, and Delete (CRUD) methods for sqlx.
Use
add the following to your project's Cargo.toml:
[dependencies]
anorm = { virsion = "0.1", features = ["mysql"] }
sqlx = { version = "0.7", features = ["mysql","runtime-tokio-native-tls"] }
- features: mysql, postgres, sqlite, mssql
Examples
#[derive(Debug, Crud, sqlx::FromRow)]
#[anorm(rename = "users")] // rename table name
struct User {
// anorm(id) // default first field is primary key
#[anorm(seq)] // sequence field, insert will ignore this field
pub id: u64,
#[anorm(rename = "name")] // rename field name
#[anorm(by)] // generate query_by_field,update_by_field,delete_by_field
pub name: String,
#[anorm(update)] // generate method update_xxx.
pub password: String,
#[anorm(skip)] // ignore field
#[sqlx(skip)]
pub addr: Option<String>,
// #[sqlx(skip)]
// pub age: i32,
}
pub async fn get_pool() -> Result<MySqlPool> {
MySqlPoolOptions::new()
.connect("mysql://root:password@192.168.1.199:3306/hello").await
}
#[tokio::test]
async fn test_query() {
let pool=get_pool().await.unwrap();
let u = User::get(&pool, 1).await;
println!("get {:?}", u);
let u = User::get_by(&pool, "where id=?", args!(1)).await;
println!("get_by {:?}", u);
let u = User::query_by_name(&pool, "plucky".into()).await;
println!("query_by_name {:?}", u);
let u =User::query(&pool).await;
println!("list {:?}",u);
// u.update(&pool).await;
// u.insert(&pool).await;
// u.delete(&pool).await
// let list = vec![User::new(0, "lusy3", "123456"),User::new(0, "lusy5", "123456")];
// let r =User::insert_all(&pool, list).await;
// println!("list: {:?}",r);
}
#[derive(Crud)]
generate method: get, get_by, query, query_by, update, delete, insert, insert_all.
attributes:
#[anorm(id)]
default first field is primary key or set.
#[anorm(seq)]
sequence field, auto increment. insert will skip this field.
#[anorm(rename="name")]
rename table name or field name. default table name by struct name to_table_case: UserDetail => user_detail. default field name by field name to_snake_case: UserDetail => user_detail.
#[anorm(skip)]
ignore field. using sqlx::FromRow, skip need #[anorm(skip)]
and #[sqlx(skip)]
#[anorm(update)]
generate method update_xxx.
#[anorm(by)]
generate qet_by_field, query_by_field, update_by_field, delete_by_field.
#[derive(FromRow)]
generate impl sqlx::FromRow for struct.
or use #[derive(sqlx::FromRow)]
.
if using sqlx::FromRow, if need skip field, both #[anorm(skip)]
add #[sqlx(skip)]
.
macro_export
args
let args = args!(&name, age);
query
query!("insert into users (name, password) values (?,?)", name, password).execute(&pool).await
query_as
query_as!(User, "select * from users where name = ?", name).fetch_one(&pool).await
Dependencies
~0.5–1MB
~21K SLoC