当前位置: 首页 > 软件库 > 数据库相关 > >

sqlx-model

轻量级 Rust ORM 实现
授权协议 Apache
开发语言 Rust
所属分类 数据库相关
软件类型 开源软件
地区 国产
投 递 者 沈畅
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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后的user
pub struct UserModel {
    #[sqlx(default)]
    pub id: u32,
    #[sqlx(default)]
    pub nickname: String,
    #[sqlx(default)]
    pub gender: u8,
    #[sqlx(default)]
    pub headimg: Option<String>,
    #[sqlx(default)]
    #[sqlx(rename="password_id")]//自定义字段名
    pub password_id: u32,
}
  1. 新增:

更多使用方法参考 tests 目录

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

更多使用方法参考 tests 目录

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

更多使用方法参考 tests 目录

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

更多使用方法参考 tests 目录

let select=Select::type_new::<UserModel>();
    let user=select.fetch_one_by_scalar_pk::<UserModel,_,_>(iid, &db).await.unwrap();
    assert_eq!(user.id as u64,iid);
  1. 事务:

更多使用方法参考 tests 目录

let mut ta=db.begin().await.unwrap();
    let nike_name="new tran".to_string();
    let userinsert=sqlx_model::model_option_set!(UserModelRef,{
        nickname:nike_name,
        gender:11,
    });
    Insert::<sqlx::MySql,UserModel,_>::new(userinsert).execute(&mut ta).await.unwrap();
    //其他 查删改操作...
    ta.commit().await.unwrap();
  1. 事务跟Poll选择执行
fn my_exec(transaction:Option<&mut Transaction<'t,sqlx::MySql>>){
    let pool=get_db_pool();
    let res=executor_option!({
        //  transaction 为 None 用 &pool 代替 db 如果 [因为execute为泛型且为&mut,多次时需要手动调用as_copy]
        //  否则为 transaction 里的值代替 db
        Insert::<sqlx::MySql, UserEmailModel, _>::new(idata).execute(db.as_copy()).await?
    },transaction,&pool,db);
}
  1. 日期及其他自定义字段类型支持示例
use chrono::{DateTime, Datelike, TimeZone, Timelike, Utc};
use sqlx::FromRow;
use sqlx_model::{SqlQuote, SqlxModel};
use std::ops::Deref;
#[derive(sqlx::Type, Clone, Debug, PartialEq, Eq)]
#[sqlx(transparent)]
pub struct MyTime<Tz: TimeZone>(DateTime<Tz>);
impl<Tz: TimeZone> Deref for MyTime<Tz> {
    type Target = DateTime<Tz>;
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}
 //其他自定义结构需实现 SqlQuote<T> 
 //其中 T 为sqlx支持类型[如String,i32,i64...等]
impl<Tz: TimeZone> SqlQuote<String> for MyTime<Tz> {
    fn sql_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)]
pub struct UserModel {
    #[sqlx(default)]
    pub id: u64,
    pub id1: MyTime<Utc>,
}

辅助SQL生成操作

  • 九、用 Sqlx 访问数据库      前一节,我们学习了如何在 Rust 项目中集成 Sqlx,本节我们继续完善该工程,以看看如何用 Sqlx 来具体的访问数据库。   1、目录结构 . ├── Cargo.lock ├── Cargo.toml ├── README.md ├── config.yaml └── src ├── boot │ ├── db.rs │

  • generate golang mysql数据操作层代码生成工具,采用sqlx作为操作库,在项目中想使用该工具需要为你的项目安装sqlx依赖: # mysql驱动安装 go get -u github.com/go-sql-driver/mysql # sqlx安装 go get -u github.com/jmoiron/sqlx 生成的代码结构如下 repository -- model.go

  • 八、Rust 集成 Sqlx      Rust 语言级异步,是 xxx 版添加进来的特性。如果只是需要一款支持异步的连接池工具,推荐 tokio-postgres、deadpool-postgres。而用于生产工序,还是需要 ORM 的加入。本节我们来学习一下 sqlx。      本节需要 PostgreSQL 数据库,需要读者提前准备,并假定实例中已包含名为 postgres 的库,且账号为

  • =================为什么需要依赖管理================== 最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面。这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决? godep Go语言从v1.5开始开始引入vendor模式,如果项目目录下有vendor目录,那么go工具链会优先使用vendor内的包

  • 一. 命令行安装 go get github.com/jmoiron/sqlx 二. model设计 package model import "time" type User_Sqlx struct { UserId int `db:"user_id"` UserName string `db:"user_name"` Password stri

  •      最近工作中遇到了需要使用where in (?)的情况,一直尝试了几个都不行,最近在官方找到了一个解决办法,话不多说Talk is cheap,Show me the code。   ... IdInt64List = []int64{ 1, 2, 3, 5} // 需要放在where in里面更新的IdList db := config.DB // 数据库连接 query, ar

  • Sqlx Gorm 对比 170W数据下,sqlx和gorm查询不同条数数据性能对比,机器配置 8核/16G,mysql分别最大连接数为1 和 最大连接数500最大空闲连接数100的情况下测试。 package tesst import ( "fmt" "testing" "time" "github.com/jmoiron/sqlx" "gorm.io/driver/mysql"

  • 借鉴基础分页函数 // 分页 func (m *defaultSysDictItemModel) RowBuilder() squirrel.SelectBuilder { return squirrel.Select(sysDictItemRows).From(m.table)

  • 测试软件版本:go-zero v1.1.1 , golang 1.15.3 感谢网友的指点网址: https://www.yuque.com/tal-tech/go-zero/phyvoz#AP82Z 自己看的不细,还要细心些。 package main import ( "fmt" "github.com/tal-tech/go-zero/core/stores/sqlx" ) //

  • # Goctl Model goctl model 为go-zero下的工具模块中的组件之一,目前支持识别mysql ddl进行model层代码生成,通过命令行或者idea插件(即将支持)可以有选择地生成带redis cache或者不带redis cache的代码逻辑。 ## 快速开始 * 通过ddl生成 ```shell script goctl model mysql

 相关资料
  • 本文向大家介绍Android EasyBarrage实现轻量级弹幕效果,包括了Android EasyBarrage实现轻量级弹幕效果的使用技巧和注意事项,需要的朋友参考一下 本文介绍了Android EasyBarrage实现轻量级弹幕效果,分享给大家,具体如下: 概述 EasyBarrage是Android平台的一种轻量级弹幕效果目前支持以下设置: 自定义字体颜色,支持随机颜色; 自定义字体大

  • rustorm 是 Rust 语言的一个 ORM 框架,该框架目前只支持 PostgreSQL 数据库,还在进一步开发中。

  • 主要内容:使用普通函数创建 goroutine,使用匿名函数创建goroutine在编写 Socket 网络程序时,需要提前准备一个线程池为每一个 Socket 的收发包分配一个线程。开发人员需要在线程数量和 CPU 数量间建立一个对应关系,以保证每个任务能及时地被分配到 CPU 上进行处理,同时避免多个任务频繁地在线程间切换执行而损失效率。 虽然,线程池为逻辑编写者提供了线程分配的抽象机制。但是,如果面对随时随地可能发生的并发和线程处理需求,线程池就不是非常直观和方便了。能否

  • Jenkins Pipeline插件有一个称为“轻量级签出”的功能,其中主服务器仅从repo中提取Jenkinsfile,而不是整个repo。配置屏幕中有一个相应的复选框。我想在多分支管道中进行轻量级签出,但我在多分支配置屏幕中没有看到复选框。有什么想法如何实现这一点吗?我注意到一些关闭的问题表明此功能可用,但我无法找到任何有关如何实现它的细节。 相关资料: https://issues.jenk

  • SQLx �� The Rust SQL Toolkit Install | Usage | Docs Built with ❤️ by The LaunchBadge team Have a question? Be sure to check the FAQ first! SQLx is an async, pure Rust† SQL crate featuring compile-time

  • 问题内容: JPanel和JFrame有什么区别,以及与轻量级,重量级的关系? 问题答案: JPanel是允许将多个UI组件放在一起的容器。JFrame是使用Swing编写的窗口。 所有的Swing组件都是所谓的“轻型”组件,因为它们是用Java编写的。例如,如果您运行Swing应用程序并尝试使用UI分析工具(例如Windows中的WinSpy)对其进行分析,则只会看到一个元素:窗口(JFrame