#sqlx #crud #orm #sql

co-orm

为sqlx实现创建、读取、更新和删除(CRUD)方法

15个发布版本

0.3.12 2024年8月3日
0.3.10 2024年5月17日
0.3.9 2024年3月18日
0.3.3 2023年12月15日
0.2.3 2022年10月24日

数据库接口 中排名第426

Download history 138/week @ 2024-05-13 21/week @ 2024-05-20 7/week @ 2024-06-03 1/week @ 2024-06-10 17/week @ 2024-07-22 211/week @ 2024-07-29 25/week @ 2024-08-05

每月下载量253

MIT许可

23KB
166

为sqlx实现创建、读取、更新和删除(CRUD)方法。

Crates.io Docs Download

使用

将以下内容添加到项目的Cargo.toml中

[dependencies]
co-orm = { virsion = "0.3", features = ["mysql"] }
sqlx = { version = "0.7", features = ["mysql","runtime-tokio-native-tls"] }


  • features: mysql, postgres, sqlite

示例

#[derive(Debug, Crud, sqlx::FromRow)]
#[co_orm(rename = "users")] // rename table name
struct User {
    // co_orm(id) // default first field is primary key
    #[co_orm(seq)] // sequence field, insert will ignore this field
    pub id: u64,
    [co_orm(rename = "name")] // rename field name
    #[co_orm(by)] // generate query_by_field,update_by_field,delete_by_field
    pub name: String,
    #[co_orm(update)] // generate method update_xxx. 
    pub password: String,
    #[co_orm(skip)] // ignore field
    #[sqlx(skip)]
    pub addr: Option<String>,
    // 
    // pub age: i32,
    // #[co_orm(skip_insert)] // insert will ignore this field
}


pub async fn get_pool() -> Result<MySqlPool> {
    MySqlPoolOptions::new()
        .connect("mysql://root:[email protected]: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)]

生成方法:get, get_by, query, query_by, update, delete, insert, insert_all, query_page_by

属性

#[co_orm(id)]

默认第一个字段是主键或设置。

#[co_orm(seq)]

序列字段,自增。插入将跳过此字段。

#[co_orm(skip_insert)]

插入将跳过此字段。

#[co_orm(rename="name")]

重命名表名或字段名。默认表名为结构名字符串转换:UserDetail => user_detail。默认字段名为字段名转换:UserDetail => user_detail。

#[co_orm(skip)]

忽略字段。使用sqlx::FromRow,跳过需要#[co_orm(skip)]#[sqlx(skip)]

#[co_orm(update)]

生成方法update_xxx。

#[co_orm(通过)]

生成qet_by_field, query_by_field, update_by_field, delete_by_field。

#[co_orm(skip_insert)]插入将跳过此字段。

#[derive(FromRow)]

为结构体生成 impl sqlx::FromRow。或者使用 #[derive(sqlx::FromRow)]。如果使用 sqlx::FromRow,若需要跳过字段,则在 #[co-orm(skip)]#[sqlx(skip)] 中添加。

macro_export

参数

 let args = args!(&name, age);

分页参数

 let args = page_args!(&name, age);

查询

query!("insert into users (name, password) values (?,?)", name, password).execute(&pool).await

查询为

query_as!(User, "select * from users where name = ?", name).fetch_one(&pool).await

依赖项

~0.4–0.9MB
~19K SLoC