千家信息网

Golang数据库操作和不定字段结果查询的示例分析

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,小编给大家分享一下Golang数据库操作和不定字段结果查询的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、My
千家信息网最后更新 2026年11月01日Golang数据库操作和不定字段结果查询的示例分析

小编给大家分享一下Golang数据库操作和不定字段结果查询的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    一、Mysql数据库

    为什么要使用数据库

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

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

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

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

    二、Golang操作Mysql

    1. 现有test数据库表格user

    2. 连接mysql数据库

    2.1. 使用到的第三方库

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

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

    2.2. 连接
    package mainimport (   "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数据库查询操作

    package mainimport (   "fmt"   _ "github.com/go-sql-driver/mysql"   "github.com/jmoiron/sqlx")var db *sqlx.DBfunc 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数据库插入操作

    package mainimport (   "fmt"   _ "github.com/go-sql-driver/mysql"   "github.com/jmoiron/sqlx")var db *sqlx.DBfunc 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

    5. Update数据库更新操作

    package mainimport (   "fmt"   _ "github.com/go-sql-driver/mysql"   "github.com/jmoiron/sqlx")var db *sqlx.DBfunc 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

    6. DELETE数据库删除操作

    package mainimport (   "fmt"   _ "github.com/go-sql-driver/mysql"   "github.com/jmoiron/sqlx")var db *sqlx.DBfunc 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

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

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

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

    使用的是内置的库

    database/sql

    package mainimport (   "database/sql"   "fmt"   _ "github.com/go-sql-driver/mysql")var db *sql.DBfunc 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数据库操作和不定字段结果查询的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

    数据 数据库 查询 结果 字段 篇文章 更新 示例 分析 不同 最大 内容 类型 结构 表格 张三 李四 学习 生成 驱动 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云之行互联网科技 美国互联网保险保险科技 疫情对互联网科技公司影响 科技互联网技术 互联网科技的 易互联网科技有限公司 沃里互联网科技 滨湖区互联网智能科技产品供应 互联网科技热点资讯 语蝶互联网科技有限公司 乌苏新华互联网科技做什么的 洛阳共同富裕互联网科技有限公司 徐州市互联网科技有限公司 互联网科技公司营业执照怎么办理 恒生互联网科技业指数调整周期 互联网科技圈年度人物 神州科技互联网有限公司 上海乐五互联网科技有限公司 互联网科技和医药行业 优雇互联网科技有限公司 华脉科技工业互联网产品 老年人脱离互联网科技的作文 小米互联网科技园设置 银川新华互联网科技职业技术培训学校图片 湖北码尼互联网科技有限公司电话 华夏互联网科技业 深圳市罗太互联网科技有限公司 杭州披云加互联网科技有限公司 从那以后互联网科技有限公司 恒生互联网科技趋势
    0