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

目录
  • 一、Mysql数据库
  • 二、Golang操作Mysql
    • 1. 现有test数据库表格user
    • 2. 连接mysql数据库
      • 2.1. 使用到的第三方库
      • 2.2. 连接
    • 3. SELECT数据库查询操作
    • 4. Insert数据库插入操作
    • 5. Update数据库更新操作
    • 6. DELETE数据库删除操作
  • 三、生成动态字段数据库查询结果
    • 使用的是内置的库

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

(0)

相关推荐

  • Golang对MongoDB数据库的操作简单封装教程

    前言 Golang 对MongoDB的操作简单封装 使用MongoDB的Go驱动库 mgo,对MongoDB的操作做一下简单封装 mgo(音mango)是MongoDB的Go语言驱动,它用基于Go语法的简单API实现了丰富的特性,并经过良好测试. 初始化 操作没有用户权限的MongoDB var globalS *mgo.Session func init() { s, err := mgo.Dial(dialInfo) if err != nil { log.Fatalf("Create Se

  • 利用golang驱动操作MongoDB数据库的步骤

    安装MongoDB驱动程序 mkdr mongodb cd mongodb go mod init go get go.mongodb.org/mongo-driver/mongo 连接MongoDB 创建一个main.go文件 将以下包导入main.go文件中 package main import ( "context" "fmt" "log" "go.mongodb.org/mongo-driver/bson" &quo

  • golang常用库之操作数据库的orm框架-gorm基本使用详解

    golang常用库:gorilla/mux-http路由库使用 golang常用库:配置文件解析库-viper使用 golang常用库:操作数据库的orm框架-gorm基本使用 一:字段映射-模型定义 gorm中通常用struct来映射字段. gorm教程中叫模型定义 比如我们定义一个模型Model: type User struct { gorm.Model UserId int64 `gorm:"index"` //设置一个普通的索引,没有设置索引名,gorm会自动命名 Birth

  • Golang操作MySql数据库的完整步骤记录

    前言 MySQL是业界常用的关系型数据库,在平时开发中会经常与MySql数据库打交道,所以在接下来将介绍怎么使用Go语言操作MySql数据库. 下载MySql连接驱动 Go语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口,并不提供具体的数据库驱动.使用database/sql包时必须注入(至少)一个数据库驱动. 我们常用的数据库基本上都有完整的第三方实现.比如:MySQL驱动 **下载依赖** go get -u github.com/go-sql-driver/my

  • golang实现mysql数据库备份的操作方法

    背景 navicat是mysql可视化工具中最棒的,但是,在处理视图的导入导出方面,它是按照视图名称的字母顺序来处理的,若视图存在依赖,在导入过程中就会报错.前面已经用python写了一个,但在使用过程中,遇到xfffd编码,python的pymysql会直接崩溃.发现golang没有这个问题,正好用go重写,来熟悉golang. 一些关键点 map & json,在处理主键与外键信息时,需要用到json数据结构来存储中间结果,因为要灵活处理,在golang中只能用map[string]inte

  • 在golang中操作mysql数据库的实现代码

    前言 Golang 提供了database/sql包用于对SQL数据库的访问, 作为操作数据库的入口对象sql.DB, 主要为我们提供了两个重要的功能: •sql.DB 通过数据库驱动为我们提供管理底层数据库连接的打开和关闭操作. •sql.DB 为我们管理数据库连接池 需要注意的是,sql.DB表示操作数据库的抽象访问接口,而非一个数据库连接对象;它可以根据driver打开关闭数据库连接,管理连接池.正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用.所以,如果你没有把连接释放回连接池,

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

    目录 一.Mysql数据库 二.Golang操作Mysql 1. 现有test数据库表格user 2. 连接mysql数据库 2.1. 使用到的第三方库 2.2. 连接 3. SELECT数据库查询操作 4. Insert数据库插入操作 5. Update数据库更新操作 6. DELETE数据库删除操作 三.生成动态字段数据库查询结果 使用的是内置的库 一.Mysql数据库 为什么要使用数据库 一开始人手动记录数据,不能长期保存,追溯: 然后创建了文件系统,能够长期保存,但是查询追溯更新麻烦,数

  • Spring jdbc中数据库操作对象化模型的实例详解

    Spring jdbc中数据库操作对象化模型的实例详解 Spring Jdbc数据库操作对象化 使用面向对象方式表示关系数据库的操作,实现一个线程安全可复用的对象模型,其顶级父类接口RdbmsOperation. SqlOperation继承该接口,实现数据库的select, update, call等操作. 1.查询接口:SqlQuery 1) GenericSqlQuery, UpdatableSqlQuery, MappingSqlQueryWithParameter 2) SqlUpda

  • golang连接mysql数据库操作使用示例

    目录 安装 连接数据库 处理类型(Handle Types) 建表 Exec使用 Exec增删该示例 sql预声明(Prepared Statements) Query Queryx QueryRow和QueryRowx Get 和Select(非常常用) 事务(Transactions) 连接池设置 案例使用 golang操作mysql 安装 go get "github.com/go-sql-driver/mysql" go get "github.com/jmoiron

  • golang gorm 操作mysql及gorm基本用法

    golang 官方的那个操作mysql的有点麻烦所以就使用了gorm,下面就gorm的使用做下简单介绍 下载gorm: go get -u github.com/jinzhu/gorm 在项目中引入gorm: import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) 定义db连接信息 func DbConn(MyUser, Password, Host, Db stri

  • 实现像php一样方便的go ORM数据库操作示例详解

    目录 引言 php的方便 go的麻烦 解决方案 写在最后 引言 很多人都是从php转过来的吧,不知道你们有没有发现,go界的orm并没有像php的orm一样好用.这篇文章里,我们认真的讨论下这个问题,并且会在后面提出解决方案. php的方便 比如你想实现一个关联查询,在php里,你只需要不断的使用箭头函数就可以了. $users = DB::table('users')->whereIn('id', [1, 2, 3])->orderBy('name', 'desc')->get();

  • Python 模拟员工信息数据库操作的实例

    1.功能简介 此程序模拟员工信息数据库操作,按照语法输入指令即能实现员工信息的增.删.改.查功能. 2.实现方法 • 架构: 本程序采用python语言编写,关键在于指令的解析和执行:其中指令解析主要运用了正则表达式来高效匹配有效信息:指令执行通过一个commd_exe主执行函数和增.删.改.查4个子执行函数来实现,操作方法主要是运用面向对象方法将员工信息对象化,从而使各项操作都能方便高效实现.程序主要函数如下: (1)command_exe(command) 指令执行主函数,根据指令第一个字段

  • 复制数据库表中两个字段数据的SQL语句

    复制数据库表中两个字段数据的SQL语句 今天为表新添加一个字段,但又想与表中的另一个字段值相同,由于数据过多想通过sql语句实现,经测试下面的这句话确实很好用. 复制代码 代码如下: update jb51_temp set B=A jb51_temp 代表表明 A是有数值的字段,B是新添加的字段 ,记住空值表放到前面,如果set a=b,那么你的数值都为空了,就麻烦了,建议操作前备份数据库. 如何将一个字段里的值复制添加到另一个字段中 比如,有二个字段A和B,A字段是值是"我",B字

  • mysql仿asp的数据库操作类

    CODE:[复制到剪切板]<?php class MySQLDB   {     //MYSQL数据库操作类     //作者:熊毅     //版本:2.0(发行版) //可以自由转载,修改请通知我scxy78@yeah.net     //转载请保留以上声明 //上进行操作,当然也可以每次指定特殊的表进行操作     //nErr指示是否操作出错,sErr记录最后一次出错的错误代码,记录了明确的有哪个函数引起的错误     //错误之处请指正     //欢迎来信与我交流编程经验:scxy7

随机推荐