Documentation
use crate::curd_mysql::common::db_mysql;
use crate::curd_mysql::common::UserModel;
use crate::curd_mysql::common::UserModelRef;
use sqlx_model::{Insert, ModelTableName, Update};
#[tokio::test]
async fn curd_insert() {
    let db = db_mysql().await;
    //---
    let nike_name = "new insert".to_string();
    let gender = 1;
    let userinsert = sqlx_model::model_option_set!(UserModelRef,{
        nickname:nike_name,
        gender:gender,
    });
    let i1 = Insert::<sqlx::MySql, UserModel, _>::new(userinsert)
        .execute(&db)
        .await
        .unwrap();
    assert!(i1.last_insert_id() > 0);

    //---
    let nike_name = "new vec insert".to_string();
    let gender = 1;
    let userinsert = vec![sqlx_model::model_option_set!(UserModelRef,{
        nickname:nike_name,
        gender:gender,
    })];
    let i2 = Insert::<sqlx::MySql, UserModel, _>::new_vec(userinsert)
        .execute(&db)
        .await
        .unwrap();
    assert!(i2.last_insert_id() > 0);

    //---
    let nickname = "model insert".to_string();
    let i3 = Insert::<sqlx::MySql, UserModel, _>::model(&UserModel {
        id: i2.last_insert_id() as u32 + 100,
        nickname: nickname.clone(),
        gender: 1,
        headimg: Some("ddd".to_string()),
        password_id: 1,
    })
    .execute(&db)
    .await
    .unwrap();
    assert_eq!(i3.rows_affected(), 1);

    //---
    let vec = vec![UserModel {
        id: i3.last_insert_id() as u32 + 101,
        nickname: "model vec".to_string(),
        gender: 1,
        headimg: Some("ddd".to_string()),
        password_id: 1,
    }];
    let i4 = Insert::<sqlx::MySql, UserModel, _>::model_vec(&vec)
        .execute(&db)
        .await
        .unwrap();
    assert_eq!(i4.rows_affected(), 1);

    //---
    let umodel = UserModel {
        id: i3.last_insert_id() as u32 + 101,
        nickname: "model vec ".to_string(),
        gender: 1,
        headimg: Some("ddd".to_string()),
        password_id: 1,
    };
    let nike_name = "model insert change".to_string();
    let userchange = sqlx_model::model_option_set!(UserModelRef,{
        nickname:nike_name,
    });
    let update = Update::<sqlx::MySql, UserModel, _>::new(userchange);
    let i5 = Insert::<sqlx::MySql, UserModel, _>::model(&umodel)
        .execute_update(&update, &db)
        .await
        .unwrap();
    assert_eq!(i5.rows_affected(), 2);

    //---
    let umodel = UserModel {
        id: i3.last_insert_id() as u32 + 201,
        nickname: "model vec ".to_string(),
        gender: 1,
        headimg: Some("ddd".to_string()),
        password_id: 1,
    };
    let tmp = Insert::<sqlx::MySql, UserModel, _>::model(&umodel);
    let sql = {
        let table = UserModel::table_name();
        let vals = tmp.sql_values();
        let sql = format!(
            "INSERT INTO {} ({})VALUES {}",
            table.full_name(),
            tmp.fields.to_vec().join(","),
            vals.join(",")
        );
        sql
    };
    let i6 = sqlx::query(sql.as_str()).execute(&db).await.unwrap();
    assert_eq!(i6.rows_affected(), 1);

    let nike_name = "new insert".to_string();
    let gender = 1;
    let userinsert = sqlx_model::model_option_set!(UserModelRef,{
        nickname:nike_name,
        gender:gender,
    });
    let tmp = Insert::<sqlx::MySql, UserModel, _>::new(userinsert);
    let sql = {
        let table = UserModel::table_name();
        let vals = tmp.sql_values();
        let sql = format!(
            "INSERT INTO {} ({})VALUES {}",
            table.full_name(),
            tmp.fields.to_vec().join(","),
            vals.join(",")
        );
        sql
    };
    let i7 = sqlx::query(sql.as_str()).execute(&db).await.unwrap();
    assert_eq!(i7.rows_affected(), 1);

    let nike_name = "new insert 8".to_string();
    let gender = 1;
    let userinsert = sqlx_model::model_option_set!(UserModelRef,{
        nickname:nike_name,
        gender:gender,
    });
    let tmp = Insert::<sqlx::MySql, UserModel, _>::new(userinsert);
    let sql = {
        let table = UserModel::table_name();
        let vals = tmp.sql_values();
        let sql = format!(
            "INSERT INTO {} ({})VALUES {}",
            table.full_name(),
            tmp.fields.to_vec().join(","),
            vals.join(",")
        );
        sql
    };
    let mut res = sqlx::query(sql.as_str());
    res = tmp.bind_values(res);
    let i8 = res.execute(&db).await.unwrap();
    assert_eq!(i8.rows_affected(), 1);
}