我是靠谱客的博主 活力铃铛,最近开发中收集的这篇文章主要介绍Go-MySQL(一)Go操作MySQL进行CRUD基本操作Go-MySQL(一)Go操作MySQL进行CRUD基本操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • Go-MySQL(一)Go操作MySQL进行CRUD基本操作
    • 连接
    • 查询
      • 单条查询
      • 多条查询
    • 更新
    • 事务
    • 完整demo

Go-MySQL(一)Go操作MySQL进行CRUD基本操作

连接

下载go-mysql驱动

go get -u github.com/go-sql-driver/mysql

导入包,只在导包的时候调用包init函数即可,其他函数不用,采用匿名导包

import (
	_ "github.com/go-sql-driver/mysql"
)

连接数据库:

// 数据库连接
func connect() *sql.DB{
	db,err := sql.Open("mysql","root:123@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True")
	if err != nil{
		log.Fatal("数据库连接失败")
	}
	return db
}

username:password@tcp:数据库链接:端口号

本文采用的表如下:

CREATE TABLE `doctor_tb` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT '' COMMENT '姓名',
  `age` int(11) DEFAULT '0' COMMENT '年龄',
  `sex` int(11) DEFAULT '0' COMMENT '性别',
  `addTime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='医生表';

数据库数据结构:

type Doctor struct {
	ID int32
	Name string
	Age int32
	Sex int32
	AddTime time.Time
}

查询

单条查询

// 查询单条数据
func QueryOne(db *sql.DB) {
	doc := Doctor{}
	rows := db.QueryRow("select * from doctor_tb where id = ?", 1)
	// rows.Scan 用于把读取的数据赋值到Doctor对象的属性上,要注意字段顺序,按照表定义顺序
	err1 := rows.Scan(&doc.ID, &doc.Name, &doc.Age, &doc.Sex, &doc.AddTime)
	if err1 != nil{
		log.Fatal(err1)
	}
	//延迟到函数结束关闭链接
	defer db.Close()
	fmt.Println("单条数据结果:", doc)
}
  • db.QueryRow:传入查询sql和参数即可,?占位符
  • rows.Scan:用于把读取的数据赋值到Doctor对象的属性上,要注意字段顺序,按照表定义顺序

多条查询

// 查询多条数据
func QueryRows(db *sql.DB) {
	rows,err := db.Query("select * from doctor_tb where id > ?",0)
	if err != nil{
		log.Fatal(err)
	}
	doctors := []Doctor{}
	// 迭代结果集
	for rows.Next(){
		doc := Doctor{}
		if e :=  rows.Scan(&doc.ID, &doc.Name, &doc.Age, &doc.Sex, &doc.AddTime); e != nil{
			log.Fatal(e)
		}
		doctors = append(doctors, doc)
	}
	fmt.Println("查询多条数据:",doctors)
	defer db.Close()
}

更新

增删改都是通过db.Exec()

// 新增数据
func UpdateData(db *sql.DB,sql string,args... interface{})  {
	// 增删改都是通过db.Exec()执行sql实现
	// 遇到:unsupported type []interface {}, a slice of interface
	// 解决:https://www.shangmayuan.com/a/1b423b1d401d4777a76202e4.html
	result,err := db.Exec(sql,args...)
	if err != nil{
		log.Fatal(err)
	}
	// 受影响的行数
	rows,_ := result.RowsAffected()
	id,_ := result.LastInsertId()
	fmt.Println("受影响行数:",rows)
	fmt.Println("自增id:",id)
}

注意:可变参数传入Exec函数的要加上…,才能识别为可变参数,否则被识别为[]interface{}这一个参数而已

事务

func UpdateDataWithTx(db *sql.DB)  {
	// 开始事务
	tx,err := db.Begin()
	if err != nil{
		log.Fatal(err)
	}
	UpdateData(db,"update doctor_tb set age=20 where id = ?", 3)
	UpdateData(db,"update doctor_tb set age=20 where id = ?", 2)
	// 提交事务
	if e := tx.Commit();e != nil{
		// 报错则回滚
		tx.Rollback()
	}
	defer db.Close()
}

整体来说go操作mysql还是挺简单的

完整demo

package go_mysql

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"time"
)

func TestMysql()  {
	//go QueryRows(connect())
	//go QueryOne(connect())
	//go UpdateData(connect(),"insert into doctor_tb(id,name,age,sex,addTime)values(?,?,?,?,Now())",4,"test",10,1)
	//go UpdateData(connect(),"update doctor_tb set age=20 where id = ?", 1)
	//go UpdateData(connect(),"delete from doctor_tb where name = ?", "kevin")
	go UpdateDataWithTx(connect())
	time.Sleep(2 * time.Second)
}

// 数据库连接
func connect() *sql.DB{
	db,err := sql.Open("mysql","root:123@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True")
	if err != nil{
		log.Fatal("数据库连接失败")
	}
	return db
}

type Doctor struct {
	ID int32
	Name string
	Age int32
	Sex int32
	AddTime time.Time
}

// 查询单条数据
func QueryOne(db *sql.DB) {
	doc := Doctor{}
	rows := db.QueryRow("select * from doctor_tb where id = ?", 1)
	// rows.Scan 用于把读取的数据赋值到Doctor对象的属性上,要注意字段顺序,按照表定义顺序
	err1 := rows.Scan(&doc.ID, &doc.Name, &doc.Age, &doc.Sex, &doc.AddTime)
	if err1 != nil{
		log.Fatal(err1)
	}
	//延迟到函数结束关闭链接
	defer db.Close()
	fmt.Println("单条数据结果:", doc)
}

// 查询多条数据
func QueryRows(db *sql.DB) {
	rows,err := db.Query("select * from doctor_tb where id > ?",0)
	if err != nil{
		log.Fatal(err)
	}
	doctors := []Doctor{}
	// 迭代结果集
	for rows.Next(){
		doc := Doctor{}
		if e :=  rows.Scan(&doc.ID, &doc.Name, &doc.Age, &doc.Sex, &doc.AddTime); e != nil{
			log.Fatal(e)
		}
		doctors = append(doctors, doc)
	}
	fmt.Println("查询多条数据:",doctors)
	defer db.Close()
}

// 新增数据
func UpdateData(db *sql.DB,sql string,args... interface{})  {
	// 增删改都是通过db.Exec()执行sql实现
	// 遇到:unsupported type []interface {}, a slice of interface
	// 解决:https://www.shangmayuan.com/a/1b423b1d401d4777a76202e4.html
	result,err := db.Exec(sql,args...)
	if err != nil{
		log.Fatal(err)
	}
	// 受影响的行数
	rows,_ := result.RowsAffected()
	id,_ := result.LastInsertId()
	fmt.Println("受影响行数:",rows)
	fmt.Println("自增id:",id)
}

func UpdateDataWithTx(db *sql.DB)  {
	// 开始事务
	tx,err := db.Begin()
	if err != nil{
		log.Fatal(err)
	}
	UpdateData(db,"update doctor_tb set age=20 where id = ?", 3)
	UpdateData(db,"update doctor_tb set age=20 where id = ?", 2)
	// 提交事务
	if e := tx.Commit();e != nil{
		// 报错则回滚
		tx.Rollback()
	}
	defer db.Close()
}



最后

以上就是活力铃铛为你收集整理的Go-MySQL(一)Go操作MySQL进行CRUD基本操作Go-MySQL(一)Go操作MySQL进行CRUD基本操作的全部内容,希望文章能够帮你解决Go-MySQL(一)Go操作MySQL进行CRUD基本操作Go-MySQL(一)Go操作MySQL进行CRUD基本操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部