#sqlx #crud #sql #orm #primary-key

macro anorm-macros

Implement Create, Read, Update, and Delete (CRUD) methods for sqlx

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

Download history 51/week @ 2024-02-18 6/week @ 2024-02-25 1/week @ 2024-03-03 4/week @ 2024-03-10 118/week @ 2024-03-17 1/week @ 2024-03-24 16/week @ 2024-03-31 1/week @ 2024-04-07 133/week @ 2024-05-12 23/week @ 2024-05-19

156 downloads per month
Used in anorm

MIT/Apache

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