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 的结构,用于辅助增删改查操作
如果已有表结构,可以通过表结构生成对应的rs
model文件,以下工具可用:
#[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, }
更多使用方法参考 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);
更多使用方法参考 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);
更多使用方法参考 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);
更多使用方法参考 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);
更多使用方法参考 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();
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); }
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