• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Golang 数据库操作(sqlx)和不定字段结果查询

    一、Mysql数据库

    为什么要使用数据库

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

    二、Golang操作Mysql

    1. 现有test数据库表格user

    2. 连接mysql数据库

    2.1. 使用到的第三方库

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

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

    2.2. 连接

    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数据库查询操作

    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=utf8mb4parseTime=trueloc=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 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

    5. Update数据库更新操作

    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

    6. DELETE数据库删除操作

    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

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

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

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

    使用的是内置的库

    database/sql

    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 数据库操作和不定字段结果查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

    您可能感兴趣的文章:
    • Golang操作MySql数据库的完整步骤记录
    • 利用golang驱动操作MongoDB数据库的步骤
    • golang常用库之操作数据库的orm框架-gorm基本使用详解
    • 在golang中操作mysql数据库的实现代码
    • Golang对MongoDB数据库的操作简单封装教程
    • golang实现mysql数据库备份的操作方法
    上一篇:Go语言中sync.Cond使用详解
    下一篇:golang数据结构之golang稀疏数组sparsearray详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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