请选择 进入手机版 | 继续访问电脑版

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

  [复制链接]
查看238 | 回复68 | 2021-9-15 03:16:57 | 显示全部楼层 |阅读模式
目次

一、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. package main
  2. import (
  3. "fmt"
  4. _ "github.com/go-sql-driver/mysql"
  5. "github.com/jmoiron/sqlx"
  6. )
  7. func main() {
  8. db, err := sqlx.Open("mysql", "username:password@(127.0.0.1:3306)/test?charset=utf8mb4")
  9. if err != nil {
  10. fmt.Println("open mysql failed,", err)
  11. }
  12. db.SetMaxIdleConns(5) //设置最大的空闲数
  13. db.SetMaxOpenConns(15) //设置最大的连接数
  14. }
  15. //db, err := sqlx.Open("数据库类型", "用户名:密码@tcp(地址:端口)/数据库名")
复制代码

3. SELECT数据库查询操作

  1. package main
  2. import (
  3. "fmt"
  4. _ "github.com/go-sql-driver/mysql"
  5. "github.com/jmoiron/sqlx"
  6. )
  7. var db *sqlx.DB
  8. func initDB() {
  9. var err error
  10. db, err = sqlx.Open("mysql", "username:password@(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=true&loc=Local")
  11. if err != nil {
  12. fmt.Println("open mysql failed,", err)
  13. }
  14. db.SetMaxIdleConns(5)
  15. db.SetMaxOpenConns(15)
  16. }
  17. type User struct {
  18. Id int64 `db:"id"`
  19. Name string `db:"name"`
  20. Age int64 `db:"age"`
  21. Sex string `db:"sex"`
  22. }
  23. func main() {
  24. initDB()
  25. defer db.Close()
  26. var user []User
  27. sqlStr := "SELECT * FROM user"
  28. err := db.Select(&user, sqlStr)
  29. if err != nil {
  30. fmt.Println(err)
  31. }
  32. fmt.Println(user)
  33. }
复制代码

得到效果 ->

  1. [{1 张三 20 男} {2 李四 21 女} {3 王五 25 男}]
复制代码

4. Insert数据库插入操作

  1. package main
  2. import (
  3. "fmt"
  4. _ "github.com/go-sql-driver/mysql"
  5. "github.com/jmoiron/sqlx"
  6. )
  7. var db *sqlx.DB
  8. func initDB() {
  9. var err error
  10. db, err = sqlx.Open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
  11. if err != nil {
  12. fmt.Println("open mysql failed,", err)
  13. }
  14. db.SetMaxIdleConns(5)
  15. db.SetMaxOpenConns(15)
  16. }
  17. type User struct {
  18. Id int64 `db:"id"`
  19. Name string `db:"name"`
  20. Age int64 `db:"age"`
  21. Sex string `db:"sex"`
  22. }
  23. func main() {
  24. initDB()
  25. defer db.Close()
  26. var user = User{
  27. Name: "小六",
  28. Age: 18,
  29. Sex: "女",
  30. }
  31. sqlStr := "INSERT INTO user(name, age, sex) VALUES (?,?,?)"
  32. res, err := db.Exec(sqlStr, user.Name, user.Age, user.Sex)
  33. if err != nil {
  34. fmt.Println(err)
  35. }
  36. c, _ := res.RowsAffected()
  37. fmt.Println("有多少行被创建", c)
  38. }
复制代码

得到效果 ->

  1. 有多少行被创建 1
复制代码

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

5. Update数据库更新操作

  1. package main
  2. import (
  3. "fmt"
  4. _ "github.com/go-sql-driver/mysql"
  5. "github.com/jmoiron/sqlx"
  6. )
  7. var db *sqlx.DB
  8. func initDB() {
  9. var err error
  10. db, err = sqlx.Open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
  11. if err != nil {
  12. fmt.Println("open mysql failed,", err)
  13. }
  14. db.SetMaxIdleConns(5)
  15. db.SetMaxOpenConns(15)
  16. }
  17. type User struct {
  18. Id int64 `db:"id"`
  19. Name string `db:"name"`
  20. Age int64 `db:"age"`
  21. Sex string `db:"sex"`
  22. }
  23. func main() {
  24. initDB()
  25. defer db.Close()
  26. var user = User{
  27. Id: 4,
  28. Age: 20,
  29. }
  30. sqlStr := "UPDATE user SET age=? WHERE id=?"
  31. res, err := db.Exec(sqlStr, user.Age, user.Id)
  32. if err != nil {
  33. fmt.Println(err)
  34. }
  35. c, _ := res.RowsAffected()
  36. fmt.Println("有多少行被更改", c)
  37. }
复制代码

得到效果 ->

  1. 有多少行被更改 1
复制代码

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

6. DELETE数据库删除操作

  1. package main
  2. import (
  3. "fmt"
  4. _ "github.com/go-sql-driver/mysql"
  5. "github.com/jmoiron/sqlx"
  6. )
  7. var db *sqlx.DB
  8. func initDB() {
  9. var err error
  10. db, err = sqlx.Open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
  11. if err != nil {
  12. fmt.Println("open mysql failed,", err)
  13. }
  14. db.SetMaxIdleConns(5)
  15. db.SetMaxOpenConns(15)
  16. }
  17. type User struct {
  18. Id int64 `db:"id"`
  19. Name string `db:"name"`
  20. Age int64 `db:"age"`
  21. Sex string `db:"sex"`
  22. }
  23. func main() {
  24. initDB()
  25. defer db.Close()
  26. deleteId := 3
  27. sqlStr := "DELETE FROM user WHERE id=?"
  28. res, err := db.Exec(sqlStr, deleteId)
  29. if err != nil {
  30. fmt.Println(err)
  31. }
  32. c, _ := res.RowsAffected()
  33. fmt.Println("有多少行被删除", c)
  34. }
复制代码

得到效果 ->

  1. 有多少行被删除 1
复制代码

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

三、天生 动态字段数据库查询效果

在项目中常常 会遇到 一个标题 :在同一个函数中,查询不同的表格,天生 不同的效果 ,每次都要重新构建布局 体

思绪 :把效果 弄成[]map[string]string范例 ,如许 就能把查询得到的数据都添补 进去。

利用 的是内置的库

database/sql

  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. _ "github.com/go-sql-driver/mysql"
  6. )
  7. var db *sql.DB
  8. func initDB() {
  9. var err error
  10. db, err = sql.Open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
  11. if err != nil {
  12. fmt.Println("open mysql failed,", err)
  13. }
  14. db.SetMaxIdleConns(5)
  15. db.SetMaxOpenConns(15)
  16. }
  17. func main() {
  18. initDB()
  19. defer db.Close()
  20. sqlStr := "SELECT * FROM user" //可以换成其它的查询语句,可以得到相应的查询结果,不用每次都去构建存放的结构体
  21. rows, err := db.Query(sqlStr)
  22. if err != nil {
  23. fmt.Println(err)
  24. }
  25. defer rows.Close()
  26. //列出所有查询结果的字段名
  27. cols, _ := rows.Columns()
  28. //values是每个列的值,这里获取到byte里
  29. values := make([][]byte, len(cols))
  30. //query.Scan的参数,因为每次查询出来的列是不定长的,用len(cols)定住当次查询的长度
  31. scans := make([]interface{}, len(cols))
  32. //让每一行数据都填充到[][]byte里面
  33. for i := range values {
  34. scans[i] = &values[i]
  35. }
  36. res := make([]map[string]string, 0)
  37. for rows.Next() {
  38. _ = rows.Scan(scans...)
  39. row := make(map[string]string)
  40. for k, v := range values { //每行数据是放在values里面,现在把它挪到row里
  41. key := cols[k]
  42. row[key] = string(v)
  43. }
  44. res = append(res, row)
  45. }
  46. fmt.Println(res)
  47. }
复制代码

得到效果 ->

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

到此这篇关于Golang 数据库操作(sqlx)和不定字段效果 查询的文章就先容 到这了,更多相干 Golang 数据库操作和不定字段效果 查询内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家! 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 街充骨万怎 | 2021-9-15 18:37:16 | 显示全部楼层
支持一下,下面的保持队形!
回复

使用道具 举报

avatar 司驴迁咏 | 2021-9-17 05:07:23 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的源码论坛他的站点都是商业源码,还是免费下载的那种!特别好用。访问地址:http://www.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 江左岸右郧 | 2021-9-18 03:57:14 | 显示全部楼层
看帖不回帖的人就是耍流氓,我回复了!
回复

使用道具 举报

avatar 阿阳937 | 2021-9-19 06:01:52 | 显示全部楼层
楼上的说的很多!
回复

使用道具 举报

avatar 春天到了 | 2021-9-19 06:01:55 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,影视频道的网站所有电影和连续剧都可以免费看的。访问地址:http://tv.mxswl.com
回复

使用道具 举报

avatar hdnnuz62 | 2021-9-20 23:30:24 | 显示全部楼层
无图无真相!
回复

使用道具 举报

avatar 厕层柴 | 2021-9-21 06:19:05 | 显示全部楼层
论坛的帖子越来越有深度了!
回复

使用道具 举报

avatar 半老徐爷椒 | 2021-9-26 19:52:17 | 显示全部楼层
admin楼主今年多大了?
回复

使用道具 举报

avatar 李墨285 | 2021-9-27 20:31:42 | 显示全部楼层
admin楼主人气很旺!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则