sqlx-model是基于sqlx的轻量级orm实现。
引入
使用default-features=false禁用默认使用的tokio,自行选择运行时跟数据库类型
[depedecies]sqlx-model={versio="~0.0.1-beta.15",path="../../",default-features=false,features=["sqlx-mysql"]}sqlx={versio="~0.6",features=["mysql","offlie","rutime-asyc-std-ative-tls"]}asyc-std={versio="1.10.0",features=["attributes"]}常用增删改查示例
使用前准备,结构体增加derive宏使用sqlx_model::SqlxModel宏自动增加辅助方法同时会创建UserModelRef的结构,用于辅助增删改查操作
如果已有表结构,可以通过表结构生成对应的rsmodel文件,以下工具可用:
https://crates.io/crates/sqlx-model-tools 具体使用方式参考该create文档
#[derive(sqlx::FromRow,sqlx_model::SqlxModel,Cloe,Debug)]//#[sqlx(reame_all="lowercase")]//按规则自定义字段名#[sqlx_model(table_pk="id")]//自定义表主键,不指定默认第一个字段#[sqlx_model(table_ame="users")]//自定义关联表名,不指定为去除Model后的userpubstructUserModel{#[sqlx(default)]pubid:u32,#[sqlx(default)]pubickame:Strig,#[sqlx(default)]pubgeder:u8,#[sqlx(default)]pubheadimg:Optio<Strig>,#[sqlx(default)]#[sqlx(reame="password_id")]//自定义字段名pubpassword_id:u32,}新增:更多使用方法参考tests目录
letike_ame="ewisert".to_strig();letgeder=1;letuserisert=sqlx_model::model_optio_set!(UserModelRef,{ickame:ike_ame,geder:geder,//不需要全部字段赋值,没赋值生成SQL会少对应字段,等于用表中默认值});leti1=Isert::<sqlx::MySql,UserModel,_>::ew(userisert).execute(&db).await.uwrap();assert!(i1.last_isert_id()>0);删除:更多使用方法参考tests目录
letselect=Select::type_ew::<UserModel>();letuser=select.fetch_oe_by_where::<UserModel>(Some(format!("id=1")),&db).await.uwrap();letdetete=Delete::<sqlx::MySql>::ew(UserModel::table_ame()).execute_by_pk(&user,&db).await.uwrap();assert_eq!(detete.rows_affected(),1);修改:更多使用方法参考tests目录
letike_ame="chageto1".to_strig();letuserchage=sqlx_model::model_optio_set!(UserModelRef,{ickame:ike_ame,});letupdate=Update::<sqlx::MySql,UserModel,_,_>::ew(userchage);letupdate=update.execute_by_scalar_pk(1,&db).await.uwrap();assert_eq!(update.rows_affected(),1);查询:更多使用方法参考tests目录
letselect=Select::type_ew::<UserModel>();letuser=select.fetch_oe_by_scalar_pk::<UserModel,_,_>(iid,&db).await.uwrap();assert_eq!(user.idasu64,iid);事务:更多使用方法参考tests目录
letmutta=db.begi().await.uwrap();letike_ame="ewtra".to_strig();letuserisert=sqlx_model::model_optio_set!(UserModelRef,{ickame:ike_ame,geder:11,});Isert::<sqlx::MySql,UserModel,_>::ew(userisert).execute(&mutta).await.uwrap();//其他查删改操作...ta.commit().await.uwrap();事务跟Poll选择执行fmy_exec(trasactio:Optio<&mutTrasactio<'t,sqlx::MySql>>){letpool=get_db_pool();letres=executor_optio!({//trasactio为Noe用&pool代替db如果[因为execute为泛型且为&mut,多次时需要手动调用as_copy]//否则为trasactio里的值代替dbIsert::<sqlx::MySql,UserEmailModel,_>::ew(idata).execute(db.as_copy()).await?},trasactio,&pool,db);}日期及其他自定义字段类型支持示例usechroo::{DateTime,Datelike,TimeZoe,Timelike,Utc};usesqlx::FromRow;usesqlx_model::{SqlQuote,SqlxModel};usestd::ops::Deref;#[derive(sqlx::Type,Cloe,Debug,PartialEq,Eq)]#[sqlx(trasparet)]pubstructMyTime<Tz:TimeZoe>(DateTime<Tz>);impl<Tz:TimeZoe>DerefforMyTime<Tz>{typeTarget=DateTime<Tz>;fderef(&self)->&Self::Target{&self.0}}//其他自定义结构需实现SqlQuote<T>//其中T为sqlx支持类型[如Strig,i32,i64...等]impl<Tz:TimeZoe>SqlQuote<Strig>forMyTime<Tz>{fsql_quote(&self)->Strig{format!("{}-{}-{}{}:{}:{}",self.0.year(),self.0.moth(),self.0.day(),self.0.hour(),self.0.miute(),self.0.secod())}}#[derive(FromRow,Cloe,Debug,SqlxModel)]pubstructUserModel{#[sqlx(default)]pubid:u64,pubid1:MyTime<Utc>,}辅助SQL生成操作
评论