首页>>后端>>Golang->详解Golang数据库操作(sqlx)&不定字段结果查询

详解Golang数据库操作(sqlx)&不定字段结果查询

时间:2023-11-29 本站 点击:0

一、Mysql数据库

为什么要使用数据库

一开始人手动记录数据,不能长期保存,追溯;

然后创建了文件系统,能够长期保存,但是查询追溯更新麻烦,数据可以发生冗余重复;

实现了数据库的方式,能够长期保存,方便查询,追溯,更新等等一系列操作,能设置一些约束进行数据的自我管控等等。

简单介绍下Mysql数据库的特点:关系型数据库、体积小、速度快、成本低、开源代码、中小网站适用、非常适合初学者学习

二、Golang操作Mysql

1. 现有test数据库表格user

idnameagesex1张三20男2李四21女3王五25男

2. 连接mysql数据库

2.1. 使用到的第三方库

github.com/go-sql-driver/mysql(驱动)

github.com/jmoiron/sqlx(对驱动的操作封装)

2.2. 连接

packagemainimport("fmt"_"github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx")funcmain(){db,err:=sqlx.Open("mysql","username:password@(127.0.0.1:3306)/test?charset=utf8mb4")iferr!=nil{fmt.Println("openmysqlfailed,",err)}db.SetMaxIdleConns(5)//设置最大的空闲数db.SetMaxOpenConns(15)//设置最大的连接数}
//db,err:=sqlx.Open("数据库类型","用户名:密码@tcp(地址:端口)/数据库名")

3. SELECT数据库查询操作

packagemainimport("fmt"_"github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx")vardb*sqlx.DBfuncinitDB(){varerrerrordb,err=sqlx.Open("mysql","username:password@(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=true&loc=Local")iferr!=nil{fmt.Println("openmysqlfailed,",err)}db.SetMaxIdleConns(5)db.SetMaxOpenConns(15)}typeUserstruct{Idint64`db:"id"`Namestring`db:"name"`Ageint64`db:"age"`Sexstring`db:"sex"`}funcmain(){initDB()deferdb.Close()varuser[]UsersqlStr:="SELECT*FROMuser"err:=db.Select(&user,sqlStr)iferr!=nil{fmt.Println(err)}fmt.Println(user)}

得到结果->

[{1 张三 20 男} {2 李四 21 女} {3 王五 25 男}]

4. Insert数据库插入操作

packagemainimport("fmt"_"github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx")vardb*sqlx.DBfuncinitDB(){varerrerrordb,err=sqlx.Open("mysql","superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")iferr!=nil{fmt.Println("openmysqlfailed,",err)}db.SetMaxIdleConns(5)db.SetMaxOpenConns(15)}typeUserstruct{Idint64`db:"id"`Namestring`db:"name"`Ageint64`db:"age"`Sexstring`db:"sex"`}funcmain(){initDB()deferdb.Close()varuser=User{Name:"小六",Age:18,Sex:"女",}sqlStr:="INSERTINTOuser(name,age,sex)VALUES(?,?,?)"res,err:=db.Exec(sqlStr,user.Name,user.Age,user.Sex)iferr!=nil{fmt.Println(err)}c,_:=res.RowsAffected()fmt.Println("有多少行被创建",c)}

得到结果->

有多少行被创建 1

idnameagesex1张三20男2李四21女3王五25男4小六18女

5. Update数据库更新操作

packagemainimport("fmt"_"github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx")vardb*sqlx.DBfuncinitDB(){varerrerrordb,err=sqlx.Open("mysql","superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")iferr!=nil{fmt.Println("openmysqlfailed,",err)}db.SetMaxIdleConns(5)db.SetMaxOpenConns(15)}typeUserstruct{Idint64`db:"id"`Namestring`db:"name"`Ageint64`db:"age"`Sexstring`db:"sex"`}funcmain(){initDB()deferdb.Close()varuser=User{Id:4,Age:20,}sqlStr:="UPDATEuserSETage=?WHEREid=?"res,err:=db.Exec(sqlStr,user.Age,user.Id)iferr!=nil{fmt.Println(err)}c,_:=res.RowsAffected()fmt.Println("有多少行被更改",c)}

得到结果->

有多少行被更改 1

idnameagesex1张三20男2李四21女3王五25男4小六20女

6. DELETE数据库删除操作

packagemainimport("fmt"_"github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx")vardb*sqlx.DBfuncinitDB(){varerrerrordb,err=sqlx.Open("mysql","superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")iferr!=nil{fmt.Println("openmysqlfailed,",err)}db.SetMaxIdleConns(5)db.SetMaxOpenConns(15)}typeUserstruct{Idint64`db:"id"`Namestring`db:"name"`Ageint64`db:"age"`Sexstring`db:"sex"`}funcmain(){initDB()deferdb.Close()deleteId:=3sqlStr:="DELETEFROMuserWHEREid=?"res,err:=db.Exec(sqlStr,deleteId)iferr!=nil{fmt.Println(err)}c,_:=res.RowsAffected()fmt.Println("有多少行被删除",c)}

得到结果->

有多少行被删除 1

idnameagesex1张三20男2李四21女4小六20女

三、生成动态字段数据库查询结果

在项目中经常会遇到一个问题:在同一个函数中,查询不同的表格,生成不同的结果,每次都要重新构建结构体

思路:把结果弄成[]map[string]string类型,这样就能把查询得到的数据都填充进去。

使用的是内置的库

database/sql

packagemainimport("database/sql""fmt"_"github.com/go-sql-driver/mysql")vardb*sql.DBfuncinitDB(){varerrerrordb,err=sql.Open("mysql","superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")iferr!=nil{fmt.Println("openmysqlfailed,",err)}db.SetMaxIdleConns(5)db.SetMaxOpenConns(15)}funcmain(){initDB()deferdb.Close()sqlStr:="SELECT*FROMuser"//可以换成其它的查询语句,可以得到相应的查询结果,不用每次都去构建存放的结构体rows,err:=db.Query(sqlStr)iferr!=nil{fmt.Println(err)}deferrows.Close()//列出所有查询结果的字段名cols,_:=rows.Columns()//values是每个列的值,这里获取到byte里values:=make([][]byte,len(cols))//query.Scan的参数,因为每次查询出来的列是不定长的,用len(cols)定住当次查询的长度scans:=make([]interface{},len(cols))//让每一行数据都填充到[][]byte里面fori:=rangevalues{scans[i]=&values[i]}res:=make([]map[string]string,0)forrows.Next(){_=rows.Scan(scans...)row:=make(map[string]string)fork,v:=rangevalues{//每行数据是放在values里面,现在把它挪到row里key:=cols[k]row[key]=string(v)}res=append(res,row)}fmt.Println(res)}

得到结果->

[map[age:20 id:1 name:张三 sex:男] map[age:21 id:2 name:李四 sex:女] map[age:20 id:4 name:小六 sex:女]]

作者:小小小丶叶子著作权归作者所有。

链接:https://juejin.cn/post/7003225943800037407


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