sqlx-model 轻量级 Rust ORM 实现开源项目

我要开发同款
匿名用户2023年02月06日
97阅读
开发技术Rust
所属分类数据库相关
授权协议Apache

作品详情

sqlx-model是基于sqlx的轻量级orm实现。

引入

使用default-features=false禁用默认使用的tokio,自行选择运行时跟数据库类型

[dependencies]sqlx-model={version="~0.0.1-beta.15",path="../../",default-features=false,features=["sqlx-mysql"]}sqlx={version="~0.6",features=["mysql","offline","runtime-async-std-native-tls"]}async-std={version="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,Clone,Debug)]//#[sqlx(rename_all="lowercase")]//按规则自定义字段名#[sqlx_model(table_pk="id")]//自定义表主键,不指定默认第一个字段#[sqlx_model(table_name="users")]//自定义关联表名,不指定为去除Model后的userpubstructUserModel{#[sqlx(default)]pubid:u32,#[sqlx(default)]pubnickname:String,#[sqlx(default)]pubgender:u8,#[sqlx(default)]pubheadimg:Option<String>,#[sqlx(default)]#[sqlx(rename="password_id")]//自定义字段名pubpassword_id:u32,}新增:

更多使用方法参考tests目录

letnike_name="newinsert".to_string();letgender=1;letuserinsert=sqlx_model::model_option_set!(UserModelRef,{nickname:nike_name,gender:gender,//不需要全部字段赋值,没赋值生成SQL会少对应字段,等于用表中默认值});leti1=Insert::<sqlx::MySql,UserModel,_>::new(userinsert).execute(&db).await.unwrap();assert!(i1.last_insert_id()>0);删除:

更多使用方法参考tests目录

letselect=Select::type_new::<UserModel>();letuser=select.fetch_one_by_where::<UserModel>(Some(format!("id=1")),&db).await.unwrap();letdetete=Delete::<sqlx::MySql>::new(UserModel::table_name()).execute_by_pk(&user,&db).await.unwrap();assert_eq!(detete.rows_affected(),1);修改:

更多使用方法参考tests目录

letnike_name="changeto1".to_string();letuserchange=sqlx_model::model_option_set!(UserModelRef,{nickname:nike_name,});letupdate=Update::<sqlx::MySql,UserModel,_,_>::new(userchange);letupdate=update.execute_by_scalar_pk(1,&db).await.unwrap();assert_eq!(update.rows_affected(),1);查询:

更多使用方法参考tests目录

letselect=Select::type_new::<UserModel>();letuser=select.fetch_one_by_scalar_pk::<UserModel,_,_>(iid,&db).await.unwrap();assert_eq!(user.idasu64,iid);事务:

更多使用方法参考tests目录

letmutta=db.begin().await.unwrap();letnike_name="newtran".to_string();letuserinsert=sqlx_model::model_option_set!(UserModelRef,{nickname:nike_name,gender:11,});Insert::<sqlx::MySql,UserModel,_>::new(userinsert).execute(&mutta).await.unwrap();//其他查删改操作...ta.commit().await.unwrap();事务跟Poll选择执行fnmy_exec(transaction:Option<&mutTransaction<'t,sqlx::MySql>>){letpool=get_db_pool();letres=executor_option!({//transaction为None用&pool代替db如果[因为execute为泛型且为&mut,多次时需要手动调用as_copy]//否则为transaction里的值代替dbInsert::<sqlx::MySql,UserEmailModel,_>::new(idata).execute(db.as_copy()).await?},transaction,&pool,db);}日期及其他自定义字段类型支持示例usechrono::{DateTime,Datelike,TimeZone,Timelike,Utc};usesqlx::FromRow;usesqlx_model::{SqlQuote,SqlxModel};usestd::ops::Deref;#[derive(sqlx::Type,Clone,Debug,PartialEq,Eq)]#[sqlx(transparent)]pubstructMyTime<Tz:TimeZone>(DateTime<Tz>);impl<Tz:TimeZone>DerefforMyTime<Tz>{typeTarget=DateTime<Tz>;fnderef(&self)->&Self::Target{&self.0}}//其他自定义结构需实现SqlQuote<T>//其中T为sqlx支持类型[如String,i32,i64...等]impl<Tz:TimeZone>SqlQuote<String>forMyTime<Tz>{fnsql_quote(&self)->String{format!("{}-{}-{}{}:{}:{}",self.0.year(),self.0.month(),self.0.day(),self.0.hour(),self.0.minute(),self.0.second())}}#[derive(FromRow,Clone,Debug,SqlxModel)]pubstructUserModel{#[sqlx(default)]pubid:u64,pubid1:MyTime<Utc>,}

辅助SQL生成操作

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论