# Implement Create, Read, Update, and Delete (CRUD) methods for sqlx.
## Use
add the following to your project's Cargo.toml:
```toml
[dependencies]
anorm = { virsion = "0.1", features = ["mysql"] }
sqlx = { version = "0.7", features = ["mysql","runtime-tokio-native-tls"] }
```
* features: mysql, postgres, sqlite, mssql
## Examples
```rust
#[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,
// #[sqlx(skip)]
// pub age: i32,
}
pub async fn get_pool() -> Result {
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`
``` rust
let args = args!(&name, age);
```
`query`
```rust
query!("insert into users (name, password) values (?,?)", name, password).execute(&pool).await
```
`query_as`
```rust
query_as!(User, "select * from users where name = ?", name).fetch_one(&pool).await
```