脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Golang 数据库操作(sqlx)和不定字段结果查询

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

2021-09-18 00:52小小小丶叶子 Golang

本文主要介绍了Golang 数据库操作(sqlx)和不定字段结果查询,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、mysql数据库

为什么要使用数据库

  • 一开始人手动记录数据,不能长期保存,追溯;
  • 然后创建了文件系统,能够长期保存,但是查询追溯更新麻烦,数据可以发生冗余重复;
  • 实现了数据库的方式,能够长期保存,方便查询,追溯,更新等等一系列操作,能设置一些约束进行数据的自我管控等等。

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

二、golang操作mysql

1. 现有test数据库表格user

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

2. 连接mysql数据库

2.1. 使用到的第三方库

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

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

2.2. 连接

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main
 
import (
   "fmt"
   _ "github.com/go-sql-driver/mysql"
   "github.com/jmoiron/sqlx"
)
 
func main() {
   db, err := sqlx.open("mysql", "username:password@(127.0.0.1:3306)/test?charset=utf8mb4")
   if err != nil {
      fmt.println("open mysql failed,", err)
   }
   db.setmaxidleconns(5) //设置最大的空闲数
   db.setmaxopenconns(15) //设置最大的连接数
}
 
  //db, err := sqlx.open("数据库类型", "用户名:密码@tcp(地址:端口)/数据库名")

3. select数据库查询操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package main
 
import (
   "fmt"
   _ "github.com/go-sql-driver/mysql"
   "github.com/jmoiron/sqlx"
)
 
var db *sqlx.db
 
func initdb() {
   var err error
   db, err = sqlx.open("mysql", "username:password@(127.0.0.1:3306)/test?charset=utf8mb4&parsetime=true&loc=local")
   if err != nil {
      fmt.println("open mysql failed,", err)
   }
   db.setmaxidleconns(5)
   db.setmaxopenconns(15)
}
 
type user struct {
   id   int64  `db:"id"`
   name string `db:"name"`
   age  int64  `db:"age"`
   sex  string `db:"sex"`
}
 
func main() {
   initdb()
   defer db.close()
 
   var user []user
   sqlstr := "select * from user"
   err := db.select(&user, sqlstr)
   if err != nil {
      fmt.println(err)
   }
   fmt.println(user)
}

得到结果->

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

4. insert数据库插入操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package main
 
import (
   "fmt"
   _ "github.com/go-sql-driver/mysql"
   "github.com/jmoiron/sqlx"
)
 
var db *sqlx.db
 
func initdb() {
   var err error
   db, err = sqlx.open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
   if err != nil {
      fmt.println("open mysql failed,", err)
   }
   db.setmaxidleconns(5)
   db.setmaxopenconns(15)
}
 
type user struct {
   id   int64  `db:"id"`
   name string `db:"name"`
   age  int64  `db:"age"`
   sex  string `db:"sex"`
}
 
func main() {
   initdb()
   defer db.close()
 
   var user = user{
      name: "小六",
      age: 18,
      sex: "女",
   }
 
   sqlstr := "insert into user(name, age, sex) values (?,?,?)"
   res, err := db.exec(sqlstr, user.name, user.age, user.sex)
   if err != nil {
      fmt.println(err)
   }
   c, _ := res.rowsaffected()
   fmt.println("有多少行被创建", c)
}

得到结果->

有多少行被创建 1

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

5. update数据库更新操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package main
 
import (
   "fmt"
   _ "github.com/go-sql-driver/mysql"
   "github.com/jmoiron/sqlx"
)
 
var db *sqlx.db
 
func initdb() {
   var err error
   db, err = sqlx.open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
   if err != nil {
      fmt.println("open mysql failed,", err)
   }
   db.setmaxidleconns(5)
   db.setmaxopenconns(15)
}
 
type user struct {
   id   int64  `db:"id"`
   name string `db:"name"`
   age  int64  `db:"age"`
   sex  string `db:"sex"`
}
 
func main() {
   initdb()
   defer db.close()
 
   var user = user{
      id: 4,
      age: 20,
   }
 
   sqlstr := "update user set age=? where id=?"
   res, err := db.exec(sqlstr, user.age, user.id)
   if err != nil {
      fmt.println(err)
   }
   c, _ := res.rowsaffected()
   fmt.println("有多少行被更改", c)
}

得到结果->

有多少行被更改 1

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

6. delete数据库删除操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package main
 
import (
   "fmt"
   _ "github.com/go-sql-driver/mysql"
   "github.com/jmoiron/sqlx"
)
 
var db *sqlx.db
 
func initdb() {
   var err error
   db, err = sqlx.open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
   if err != nil {
      fmt.println("open mysql failed,", err)
   }
   db.setmaxidleconns(5)
   db.setmaxopenconns(15)
}
 
type user struct {
   id   int64  `db:"id"`
   name string `db:"name"`
   age  int64  `db:"age"`
   sex  string `db:"sex"`
}
 
func main() {
   initdb()
   defer db.close()
 
   deleteid := 3
 
   sqlstr := "delete from user where id=?"
   res, err := db.exec(sqlstr, deleteid)
   if err != nil {
      fmt.println(err)
   }
   c, _ := res.rowsaffected()
   fmt.println("有多少行被删除", c)
}

得到结果->

有多少行被删除 1

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

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

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

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

使用的是内置的库

database/sql

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package main
 
import (
   "database/sql"
   "fmt"
   _ "github.com/go-sql-driver/mysql"
)
 
var db *sql.db
 
func initdb() {
   var err error
   db, err = sql.open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
   if err != nil {
      fmt.println("open mysql failed,", err)
   }
   db.setmaxidleconns(5)
   db.setmaxopenconns(15)
}
 
func main() {
   initdb()
   defer db.close()
 
   sqlstr := "select * from user" //可以换成其它的查询语句,可以得到相应的查询结果,不用每次都去构建存放的结构体
   rows, err := db.query(sqlstr)
   if err != nil {
      fmt.println(err)
   }
   defer rows.close()
 
   //列出所有查询结果的字段名
   cols, _ := rows.columns()
 
   //values是每个列的值,这里获取到byte里
   values := make([][]byte, len(cols))
   //query.scan的参数,因为每次查询出来的列是不定长的,用len(cols)定住当次查询的长度
   scans := make([]interface{}, len(cols))
   //让每一行数据都填充到[][]byte里面
   for i := range values {
      scans[i] = &values[i]
   }
   res := make([]map[string]string, 0)
   for rows.next() {
      _ = rows.scan(scans...)
      row := make(map[string]string)
      for k, v := range values { //每行数据是放在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:女]]

到此这篇关于golang 数据库操作(sqlx)和不定字段结果查询的文章就介绍到这了,更多相关golang 数据库操作和不定字段结果查询内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家! 

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

延伸 · 阅读

精彩推荐
  • Golanggolang如何使用struct的tag属性的详细介绍

    golang如何使用struct的tag属性的详细介绍

    这篇文章主要介绍了golang如何使用struct的tag属性的详细介绍,从例子说起,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看...

    Go语言中文网11352020-05-21
  • Golanggo日志系统logrus显示文件和行号的操作

    go日志系统logrus显示文件和行号的操作

    这篇文章主要介绍了go日志系统logrus显示文件和行号的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    SmallQinYan12302021-02-02
  • Golanggo语言制作端口扫描器

    go语言制作端口扫描器

    本文给大家分享的是使用go语言编写的TCP端口扫描器,可以选择IP范围,扫描的端口,以及多线程,有需要的小伙伴可以参考下。 ...

    脚本之家3642020-04-25
  • Golanggolang json.Marshal 特殊html字符被转义的解决方法

    golang json.Marshal 特殊html字符被转义的解决方法

    今天小编就为大家分享一篇golang json.Marshal 特殊html字符被转义的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    李浩的life12792020-05-27
  • Golanggolang 通过ssh代理连接mysql的操作

    golang 通过ssh代理连接mysql的操作

    这篇文章主要介绍了golang 通过ssh代理连接mysql的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    a165861639710342021-03-08
  • GolangGolang通脉之数据类型详情

    Golang通脉之数据类型详情

    这篇文章主要介绍了Golang通脉之数据类型,在编程语言中标识符就是定义的具有某种意义的词,比如变量名、常量名、函数名等等,Go语言中标识符允许由...

    4272021-11-24
  • Golanggolang的httpserver优雅重启方法详解

    golang的httpserver优雅重启方法详解

    这篇文章主要给大家介绍了关于golang的httpserver优雅重启的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    helight2992020-05-14
  • GolangGolang中Bit数组的实现方式

    Golang中Bit数组的实现方式

    这篇文章主要介绍了Golang中Bit数组的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    天易独尊11682021-06-09