当前位置: 首页 > news >正文

Go语言对于MySQL的基本操作

一.下载依赖

终端中输入:

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

导入包

import (
	"database/sql"

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

 

二.案例

package main

//go get-u github.com/go-sql-driver/mysql  获取驱动
import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
)

var db *sql.DB
//根据数据库表中,有属性id,name,age,且id为插入时,自增1
var usergroup map[int]user = make(map[int]user, 100)

type user struct {
	id   int
	name string
	age  int
}

func initDB() (err error) {
	//连接数据库
	dsn := "root:9826942694yzy@tcp(127.0.0.1:3306)/sql_test"
	db, err = sql.Open("mysql", dsn) //dsn格式不对这里会报错
	if err != nil {
		fmt.Printf("dsn: %s invaid! err:%v\n", dsn, err)
		return err
	}

	//判断一下是否连接成功
	err = db.Ping()
	if err != nil {
		fmt.Printf("open %s failed! err:%v\n", dsn, err)
		return err
	} else {
		fmt.Printf("open %s success!\n", dsn)
	}
	//设置数据库连接池的最大连接数,根据业务调整
	db.SetMaxOpenConns(10)
	db.SetMaxIdleConns(5) //最大闲置连接数
	return nil
}

// 输入id,返回对应的user信息  查询单条记录
func queryOne(id int) (u user, err error) {
	//查询单条语句
	sqlstr := "select * from user where id=?" //?为占位符,在Query的时候可以用后续的参数进行填充
	rowObj := db.QueryRow(sqlstr, id)         //从数据库连接池中拿去一个连接去进行查询
	//得到了rowObj必须调用Scan方法,因为该方法会释放数据库连接,把连接放回连接池,否则连接池最大连接用完,则会影响后续连接查询
	rowObj.Scan(&u.id, &u.name, &u.age)
	if rowObj == nil {
		fmt.Printf("query failed,err:%v\n", err)
		return u, err
	}
	return u, nil
}

// 查询多行  读取到map中
func query() (err error) {
	sqlstr := "select * from user"
	rows, err := db.Query(sqlstr)
	if err != nil {
		fmt.Printf("query failed,err:%v\n", err)
		return
	}
	//记得关闭,放回连接池
	defer rows.Close()
	var u user
    //用一个for循环,把每次读到的行信息,存放到全局变量usergroup中,达到程序启动初始化的效果
	for rows.Next() {
		err = rows.Scan(&u.id, &u.name, &u.age)
		if err != nil {
			fmt.Printf("scan failed,err:%v\n", err)
			return
		}
		usergroup[u.id] = u
	}
	return nil
}

// 插入一条学生数据,并且更新map  id是主码,
//实际插入学生数据的时候,并不知道数据库中学号应该分配多少,所以在插入后得到返回的id,再更新map
func insert(u user) (id int64, err error) {
	sqlstr := "insert into user(name,age) values(?,?)"
	var res sql.Result
    //执行该语句
	res, err = db.Exec(sqlstr, u.name, u.age)
	if err != nil {
		fmt.Printf("insert failed,err:%v\n", err)
		return
	}
	//拿到插入的id,返回
	id, err = res.LastInsertId()
	if err != nil {
		fmt.Printf("insert failed,err:%v\n", err)
		return
	}
	return id, nil
}

//删除指定id的user,实际上最好判断一下是否存在map中,这里就先不写了
func deleteUser(id int) (err error) {
	sqlstr := "delete from user where id=?"
	_, err = db.Exec(sqlstr, id)
	if err != nil {
		fmt.Printf("delete failed,err:%v\n", err)
		return err
	}
	delete(usergroup, id)
	return nil
}

// 查询单条语句
func test01() {
	//查询学号为1的学生信息
	u, err := queryOne(1)
	if err != nil {
		fmt.Printf("query failed,err:%v\n", err)
		return
	}
	println(u.id, u.name, u.age)

}

// 程序初始化时,把user表中信息全部读取到map中
func readToMap() {
	//从数据库中读取user放入map中
	err := query()
	if err != nil {
		fmt.Printf("query failed,err:%v\n", err)
		return
	}
}

// 测试插入
func myInsertTest() {
	var u user
	u.age = 23
	u.name = "周杰伦"
	id, err1 := insert(u)
	if err1 != nil {
		fmt.Printf("insert failed,err:%v\n", err1)
		return
	}
	//说明插入成功
	u.id = int(id)
	usergroup[u.id] = u
}

//遍历map
func printMap() {
	//遍历
	for _, u := range usergroup {
		println(u.id, u.name, u.age)
	}
	println("***************************************")
}

func main() {
	err := initDB()
	defer db.Close()
	if err != nil {
		fmt.Printf("init db failed,err:%v\n", err)
		return
	}
	readToMap()
	printMap()

	myInsertTest()
	printMap()

}

相关文章:

  • .NET 9 中 OpenAPI 替代 Swagger 文档生成
  • Python精进系列:解包(Unpacking)用法之 *args 和 **kwargs
  • 使用py-ffmpeg批量合成视频的脚本
  • HarmonyOS NEXT开发进阶(十二):build-profile.json5 文件解析
  • 根据公式和a求出假设的b,再将b代入公式中反证是否能求出a
  • Vue 中的 MVVM、MVC 和 MVP 模式深度解析
  • 【java】网络编程——UDP协议通信
  • 【go语言圣经1.6】
  • Linux操作系统6- 线程2(线程的创建,终止,等待与退出)
  • docker 增加镜像(忘记什么bug了)
  • Java 反射机制学习
  • 对C++面向对象的理解
  • 学习用WinDbg查看程序当前运行的堆栈
  • 代码随想录day17 二叉树part05
  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring MVC 的崛起:从 Struts 到 Spring 的演进
  • 软考网络安全专业
  • selenium等待
  • Python----数据分析(Pandas一:pandas库介绍,pandas操作文件读取和保存)
  • Linux 中 Git 使用指南:从零开始掌握版本控制
  • C语言_数据结构总结10:二叉树的递归/非递归遍历
  • 专访|茸主:杀回UFC,只为给自己一个交代
  • 通化市委书记孙简升任吉林省副省长
  • 王毅谈中拉论坛十年成果
  • 新疆交通运输厅厅长西尔艾力·外力履新吐鲁番市市长候选人
  • 人民日报刊文:加快解放和发展新质战斗力
  • 协会:坚决支持司法机关依法打击涉象棋行业的违法行为