Go基于sqlx实现的sql增删改查的工具类

文章目录

    • 1、驱动下载
      • 1.1、依赖安装
      • 1.2、SQL数据库驱动包列表
    • 2、实现代码
      • 2.1 sql工具类代码
      • 2.2 使用例子
      • 2.3 运行效果

1、驱动下载

sqlx是Go语言内置database/sql的扩展包,它在内置database/sql基础上提供更简洁的数据库操作。
GitHub地址:https://github.com/jmoiron/sqlx
API文档:https://pkg.go.dev/github.com/jmoiron/sqlx
用例文档http://jmoiron.github.io/sqlx/

1.1、依赖安装

依赖包安装命令

go get github.com/jmoiron/sqlx

1.2、SQL数据库驱动包列表

go驱动包列表https://github.com/golang/go/wiki/SQLDrivers。

database/sql和database/sql/driver包分别用于使用Go中的数据库和实现数据库驱动程序。
Go的sql包的驱动程序包括:

  • Amazon AWS Athena: https://github.com/uber/athenadriver
  • AWS Athena: https://github.com/segmentio/go-athena
  • AWS DynamoDB: https://github.com/btnguyen2k/godynamo
  • Apache Avatica/Phoenix: https://github.com/apache/calcite-avatica-go
  • Apache H2: https://github.com/jmrobles/h2go
  • Apache Hive: https://github.com/sql-machine-learning/gohive
  • Apache Ignite/GridGain: https://github.com/amsokol/ignite-go-client
  • Apache Impala: https://github.com/bippio/go-impala
  • Azure Cosmos DB: https://github.com/btnguyen2k/gocosmos
  • ClickHouse (uses HTTP API): https://github.com/mailru/go-clickhouse
  • ClickHouse (uses native TCP interface): https://github.com/ClickHouse/clickhouse-go
  • CockroachDB: Use any PostgreSQL driver
  • Couchbase N1QL: https://github.com/couchbase/go_n1ql
  • DB2 LUW (uses cgo): https://github.com/asifjalil/cli
  • DB2 LUW and DB2/Z with DB2-Connect: https://bitbucket.org/phiggins/db2cli (Last updated 2015-08)
  • DB2 LUW, z/OS, iSeries and Informix: https://github.com/ibmdb/go_ibm_db
  • Databricks: https://github.com/databricks/databricks-sql-go
  • DuckDB: https://github.com/marcboeker/go-duckdb
  • Exasol: (pure Go): https://github.com/exasol/exasol-driver-go
  • Firebird SQL: https://github.com/nakagami/firebirdsql
  • Genji (pure go): https://github.com/genjidb/genji
  • Google Cloud BigQuery: https://github.com/solcates/go-sql-bigquery
  • Google Cloud Spanner: https://github.com/googleapis/go-sql-spanner
  • Google Cloud Spanner: https://github.com/rakyll/go-sql-driver-spanner
  • MS ADODB: https://github.com/mattn/go-adodb
  • MS SQL Server (pure go): https://github.com/microsoft/go-mssqldb
  • MS SQL Server (uses cgo): https://github.com/minus5/gofreetds
  • MaxCompute: https://github.com/sql-machine-learning/gomaxcompute
  • MySQL: https://github.com/go-sql-driver/mysql/ [*]
  • MySQL: https://github.com/siddontang/go-mysql/ [**] (also handles replication)
  • MySQL: https://github.com/ziutek/mymysql [*]
  • ODBC: https://bitbucket.org/miquella/mgodbc (Last updated 2016-02)
  • ODBC: https://github.com/alexbrainman/odbc
  • Oracle (pure go): https://github.com/sijms/go-ora
  • Oracle (uses cgo): https://github.com/godror/godror
  • Oracle (uses cgo): https://github.com/mattn/go-oci8
  • Oracle (uses cgo): https://gopkg.in/rana/ora.v4
  • Postgres (pure Go): https://github.com/jackc/pgx [*]
  • Postgres (pure Go): https://github.com/lib/pq [*]
  • Postgres (uses cgo): https://github.com/jbarham/gopgsqldriver
  • Presto: https://github.com/prestodb/presto-go-client
  • QL: https://pkg.go.dev/modernc.org/ql
  • SAP ASE (pure go): https://github.com/SAP/go-ase
  • SAP ASE (uses cgo): https://github.com/SAP/cgo-ase
  • SAP HANA (pure go): https://github.com/SAP/go-hdb
  • SAP HANA (uses cgo): https://help.sap.com/viewer/0eec0d68141541d1b07893a39944924e/2.0.03/en-US/0ffbe86c9d9f44338441829c6bee15e6.html
  • SQL over REST: https://github.com/adaptant-labs/go-sql-rest-driver
  • SQLite (uses cgo): https://github.com/gwenn/gosqlite - Supports SQLite dynamic data typing
  • SQLite (uses cgo): https://github.com/mattn/go-sqlite3 [*]
  • SQLite (uses cgo): https://github.com/mxk/go-sqlite
  • SQLite: (pure go): https://modernc.org/sqlite
  • SQLite: (uses cgo): https://github.com/rsc/sqlite
  • SingleStore: Use any MySQL driver
  • Snowflake (pure Go): https://github.com/snowflakedb/gosnowflake
  • Sybase ASE (pure go): https://github.com/thda/tds
  • Sybase SQL Anywhere: https://github.com/a-palchikov/sqlago
  • TiDB: Use any MySQL driver
  • Vertica: https://github.com/vertica/vertica-sql-go
  • Vitess: https://pkg.go.dev/vitess.io/vitess/go/vt/vitessdriver
  • YDB (pure go): https://github.com/ydb-platform/ydb-go-sdk
  • YQL (Yahoo! Query Language): https://github.com/mattn/go-yql

标有[*]的驱动程序都包含在https://github.com/bradfitz/go-sql-test的兼容性测试套件中并通过了该测试套件。
标记为[**]的驱动程序通过兼容性测试套件,但当前未包含在其中。

2、实现代码

2.1 sql工具类代码

例子使用了mysql驱动
封装的工具类sqldao.go

package daoimport (_ "github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx"
)type SqlDao struct {db        *sqlx.DBtx        *sqlx.TxDriver    stringDsn       stringOpenConns intIdleConns int
}func (dao *SqlDao) Connect() (err error) {dao.db, err = sqlx.Connect(dao.Driver, dao.Dsn)if err == nil {if dao.OpenConns > 0 {dao.db.SetMaxOpenConns(20)}if dao.IdleConns > 0 {dao.db.SetMaxIdleConns(20)}}return err
}
func (dao *SqlDao) Close() {dao.db.Close()
}
func (dao *SqlDao) InsertOne(sql string, args ...any) (int64, error) {result, err := dao.db.Exec(sql, args...)if err == nil {tid, err := result.LastInsertId()return tid, err}return 0, err
}func (dao *SqlDao) InsertOneObj(sql string, obj interface{}) (int64, error) {result, err := dao.db.NamedExec(sql, obj)if err == nil {id, err := result.LastInsertId()return id, err}return 0, err
}// 批量插入
// return int64,error 插入成功数量,错误
func (dao *SqlDao) InsertManyObj(sql string, objs []interface{}) (int64, error) {result, err := dao.db.NamedExec(sql, objs)if err == nil {count, err := result.RowsAffected()return count, err}return 0, err
}func (dao *SqlDao) FindOne(model any, sql string, args ...interface{}) error {err := dao.db.Get(model, sql, args...)return err
}func (dao *SqlDao) FindMany(model any, sql string, args ...interface{}) error {err := dao.db.Select(model, sql, args...)return err
}// 更新数据
func (dao *SqlDao) Update(sql string, args ...any) (int64, error) {ret, err := dao.db.Exec(sql, args...)if err == nil {n, err := ret.RowsAffected()return n, err}return 0, err
}// 删除数据
func (dao *SqlDao) Delete(sql string, args ...any) (int64, error) {ret, err := dao.db.Exec(sql, args...)if err == nil {n, err := ret.RowsAffected()return n, err}return 0, err
}// 开启事务
func (dao *SqlDao) Beginx() (*sqlx.Tx, error) {var err errordao.tx, err = dao.db.Beginx() // 开启事务return dao.tx, err
}// 事务回滚
func (dao *SqlDao) Rollback() error {return dao.tx.Rollback()
}// 事务提交
func (dao *SqlDao) Commit() error {return dao.tx.Commit()
}

2.2 使用例子

package mainimport ("fmt""log""mydb/dao""strconv""time"
)/*
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
*/type User struct {Id   int64  `sql:"id"`Name string `sql:"name"`Age  int    `sql:"age"`
}func (s User) String() string {return fmt.Sprintf("%v %v %v", s.Id, s.Name, s.Age)
}
func main() {dao := dao.SqlDao{Driver: "mysql",Dsn:    "root:peng123@tcp(127.0.0.1:3306)/gotest?charset=utf8mb4&parseTime=True&loc=Asia%2fShanghai",}err := dao.Connect()if err != nil {log.Fatalln("connect error====")}defer dao.Close()insertId1, err1 := dao.InsertOne("insert into user(name, age) values(?,?)", "stu1", 11)fmt.Printf("insert sql insertId:%v,%v\n", insertId1, err1)dao.InsertOneObj("insert into user(name, age) values(:name,:age)", User{Name: "stu2", Age: 67})users := []interface{}{User{Name: "stu9", Age: 20},User{Name: "stu10", Age: 21},}rowsAffected, err2 := dao.InsertManyObj("insert into user(name,age) values(:name,:age)", users)fmt.Printf("======InsertObj2:%v,%v\n", rowsAffected, err2)var user3 Userdao.FindOne(&user3, "select * from user where name=?", "stu1")fmt.Printf("======FindOne:%v\n", user3)var user4 []Userdao.FindMany(&user4, "select * from user where age < ?", 5)for index, u := range user4 {fmt.Printf("======FindMany:%v, %v\n", index, u)}rowsAffected5, err5 := dao.Update("update user set age=? where id=?", 25, 1)fmt.Printf("======Update:%v,%v\n", rowsAffected5, err5)rowsAffected6, err6 := dao.Delete("delete from user where age=?", 11)fmt.Printf("======Delete:%v,%v\n", rowsAffected6, err6)dao.Beginx()for i := 0; i <= 400000; i++ {dao.InsertOneObj("insert into user(name, age) values(:name,:age)", User{Name: "stu" + strconv.Itoa(i), Age: i})if i != 0 && i%10000 == 0 {time.Sleep(time.Duration(1) * time.Second)err = dao.Commit()fmt.Printf("======Commit i:%v, %v\n", i, err)dao.Beginx()}}
}

2.3 运行效果

D:\project\go\gotest\sql>go run main.go
insert sql insertId:1,<nil>
======InsertObj2:2,<nil>
======FindOne:1 stu1 11
======Update:1,<nil>
======Delete:0,<nil>
======Commit i:10000, <nil>
======Commit i:20000, <nil>
======Commit i:30000, <nil>
======Commit i:40000, <nil>
======Commit i:50000, <nil>
======Commit i:60000, <nil>
======Commit i:70000, <nil>
======Commit i:80000, <nil>
======Commit i:90000, <nil>
======Commit i:100000, <nil>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/29640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lc2536.子矩阵元素加1

暴力解法&#xff1a;直接按照题目所示在矩阵的相应位置加一 时间复杂度&#xff1a;O(n2 * queries.length) 空间复杂度&#xff1a;O(1) 二维差分&#xff1a;创建二维差分数组&#xff0c;通过对差分数组的修改来影响原来的数组&#xff0c;最后还原 时间复杂度&#x…

python工具库有哪些,python工具包怎么用

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python工具包有哪些&#xff0c;python工具包怎么用&#xff0c;现在让我们一起来看看吧&#xff01; 最近有多位读者留言&#xff0c;咨询更便捷、高效的python编程开发工具&#xff08;IDE&#xff09;&#xff0c;本…

Q-Vision+Kvaser CAN/CAN FD/LIN总线解决方案

智能联网技术在国内的发展势头迅猛&#xff0c;随着汽车智能化、网联化发展大潮的到来&#xff0c;智能网联汽车逐步成为汽车发展的主要趋势。越来越多整车厂诉求&#xff0c;希望可以提供本土的测量软件&#xff0c;特别是关于ADAS测试。而Softing中国推出的Q-Vision软件不仅可…

数据结构--BFS求最短路

数据结构–BFS求最短路 BFS求⽆权图的单源最短路径 注&#xff1a;⽆权图可以视为⼀种特殊的带权图&#xff0c;只是每条边的权值都为1 以 2 为 b e g i n 位置 以2为begin位置 以2为begin位置 代码实现 //求顶点u到其他顶点的最短路径 void BFS_MIN_Distance(Graph G, int u…

【flask sqlalchmey】一次性将返回的列表对象或者 一行数据对象转成dict---flask-sqlalchemy输出json格式数据

def model_to_dict(object):return {c.name: getattr(object, c.name) for c in object.__table__.columns}#将一组数据转为list def scalars_to_list(object):return [model_to_dict(c) for c in object]class Sysdict(Base,SerializerMixin):__bind_key__ forest_fire_contr…

基于kubeadm部署K8S集群:上篇

目录 一、环境准备 1、主机初始化配置 2、配置主机名绑定hosts&#xff0c;不同主机名称不同 3、主机配置初始化 4、部署docker环境 二、部署kubernetes集群 1、组件介绍 2、所有主机配置阿里云yum源 3、安装kubelet 、kubeadm 、kubectl 4、配置init-config.yaml 5、…

spring源码高级-图灵周瑜

实现factorybean可以产生代理对象

ADB连接安卓手机提示unauthorized

近期使用airtest进行自动化测试时&#xff0c;因为需要连接手机和电脑端&#xff0c;所以在使用adb去连接本人的安卓手机vivo z5时&#xff0c;发现一直提示unauthorized。后来经过一系列方法尝试&#xff0c;最终得以解决。 问题描述&#xff1a; 用数据线将手机接入电脑端&…

嵌入式面试6---操作系统原理

6 优先级反转问题在嵌入式系统中是一中严重的问题&#xff0c;必须给与足够重视。 a) 首先请解释优先级反转问题 b) 很多RTOS提供优先级继承策略(Priority inheritance)和优先级天花板策略(Priority ceilings)用来解决优先级反转问题&#xff0c;请讨论这两种策略。 答&#xf…

【N32L40X】学习笔记14-在RT-thread系统中读取eeprom数据

eeprom 说明 eeprom介绍 AT24C01A&#xff0c;1K串行EEPROM&#xff1a;内部组织16页8字节&#xff0c;1K需要一个7位数据字地址进行随机字寻址。AT24C02,2K串行EEPROM&#xff1a;内部组织32页8字节&#xff0c;2K需要一个8位数据字地址进行随机字寻址。AT24C04,4K串行EEPRO…

Android 高级进阶知识整理

Android Framework 启动流程 init 进程启动过程 Android系统启动流程 Zygote启动流程及源码分析 APP启动流程 init进程是Android用户空间第一个进程&#xff0c;主要做以下3件事情&#xff1a; 创建和挂载启动所需的文件目录。初始化和启动关键服务&#xff0c;守护关键…

以太网帧格式与吞吐量计算

以太网帧结构 帧大小的定义 以太网单个最大帧 6&#xff08;目的MAC地址&#xff09; 6&#xff08;源MAC地址&#xff09; 2&#xff08;帧类型&#xff09; 1500{IP数据包[IP头&#xff08;20&#xff09;DATA&#xff08;1480&#xff09;]} 4&#xff08;CRC校验&#xff…

4.2、Flink任务怎样读取文件中的数据

目录 1、前言 2、readTextFile&#xff08;已过时&#xff0c;不推荐使用&#xff09; 3、readFile&#xff08;已过时&#xff0c;不推荐使用&#xff09; 4、fromSource(FileSource) 推荐使用 1、前言 思考: 读取文件时可以设置哪些规则呢&#xff1f; 1. 文件的格式(tx…

COCOS项目运行的时候图片模糊的原因

1、首先。用X坐标来分析&#xff0c;如果size*Anchor Position有小数&#xff0c;如上图57*0.5667695.5。这样就会导致x模糊。如果y同样计算结果包含小数&#xff0c;那么y也会模糊。xy同时模糊的情况是最模糊的。 2、如果当前node没有问题&#xff0c;那么就要检查上级node是…

跨境电商线上店铺智能装修系统源码开发

搭建一个跨境电商线上店铺智能装修系统源码开发需要以下步骤&#xff1a; 1. 确定需求&#xff1a;首先&#xff0c;需要明确线上店铺智能装修系统的具体需求。 2. 选择开发语言和框架&#xff1a;根据需求&#xff0c;选择合适的开发语言和框架进行开发&#xff0c;可以提高…

快速上手Vue开发:新一代Vue官方脚手架(create-vue)

文章目录 一、简介二、创建一个 Vue 应用1、前提条件2、安装命令3、可选插件 一、简介 create-vue 是 Vue3 的专用脚手架&#xff0c;使用 vite 创建 Vue3 的项目&#xff0c;也可以选择安装需要的各种插件&#xff0c;使用更简单。 二、创建一个 Vue 应用 官网地址&#xff…

JVM源码剖析之System.getProperty实现

版本信息 jdk版本&#xff1a;jdk8u40 操作系统&#xff1a;Mac System.getProperty 方法大家并不陌生&#xff0c;在各大框架源码中都能见到&#xff0c;项目中也能使用到&#xff0c;那么此篇文章将带你揭开System.getProperty方法底层实现。 System.getProperty 可以拿到…

Zookeeper特性与节点数据类型详解

CAP&Base理论 CAP理论 cap理论是指对于一个分布式计算系统来说&#xff0c;不可能满足以下三点: 一致性 &#xff1a; 在分布式环境中&#xff0c;一致性是指数据在多个副本之间是否能够保持一致的 特性&#xff0c;等同于所有节点访问同一份最新的数据副本。在一致性的需…

ChatGPT在大规模数据处理和信息管理中的应用如何?

ChatGPT作为一种强大的自然语言处理模型&#xff0c;在大规模数据处理和信息管理领域有着广泛的应用潜力。它可以利用其文本生成、文本理解和问答等能力&#xff0c;为数据分析、信息提取、知识管理等任务提供智能化的解决方案。以下将详细介绍ChatGPT在大规模数据处理和信息管…

Langchain module ‘hnswlib‘ has no attribute ‘Index‘ 错误解决

Langchain module hnswlib has no attribute Index 错误解决 使用 Langchain 操作 Chroma 向量数据库时&#xff0c;报一下错误信息&#xff0c; module hnswlib has no attribute Index试着重装了不同 hnswlib 版本没有解决&#xff0c;最后解决方法是&#xff0c;不要使用 h…