Golang操作Mysql数据库 | 青训营

99 阅读3分钟

golang安装mysql数据库配置和驱动

步骤1:安装MySQL数据库

  1. 访问MySQL官方网站(www.mysql.com)并下载适用于您的操作系统的MySQL安装程序。
  2. 安装MySQL数据库,并根据提示进行设置和配置。
  3. 在安装过程中,请记住安装MySQL时的用户名和密码,以便在后续配置中使用。

步骤2:安装MySQL驱动程序

要在Go中连接和操作MySQL数据库,您需要安装MySQL驱动程序。Go中最流行的MySQL驱动程序是go-sql-driver/mysql

(中间vscode的 go get 出了很多问题可以参考别人写的文档:(blog.csdn.net/qq_24433609…

使用以下命令,使用go mod安装MySQL驱动程序:

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

简单的CRUD

数据库连接

package main

import (
	"database/sql"
	"fmt"

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

// 创建一个全局对象
var db *sql.DB

func initDB() (err error) {
	dsn := "root:1610392189@tcp(127.0.0.1:3306)/go_db?charset=utf8mb4&parseTime=True"
	//不会效验账号密码是否正确
	//注意!!!这里不要使用:=,是给全局变量赋值,然后在main函数中使用全局变量db
	db, err = sql.Open("mysql", dsn)
	if err != nil {
		return err
	}

	//尝试与数据库建立连接(校验dsn是否正确)
	err = db.Ping()
	if err != nil {
		return err
	}
	return nil
}

func main() {

	// db, err := sql.Open("mysql", "root:1610392189@/go_db") //返回一个数据库指针
	// if err != nil {
	// 	panic(err)
	// }

	// print(db)
	// //最大连接时长
	// db.SetConnMaxLifetime(time.Minute * 3) //三分钟
	// //最大连接数
	// db.SetMaxOpenConns(10)
	// //空闲连接数
	// db.SetMaxIdleConns(10)

	err := initDB()
	if err != nil {
		fmt.Printf("初始化失败!,err:%v\n", err)
		return
	} else {
		fmt.Printf("初始化成功")
	}
}

查找数据

先创建一个结构体,连接数据库,从数据库查找到的数据,对应这个结构体对象

查询一条用户信息:

type user struct {
	id       int
	username string
	password string
}

// 查询一条用户数据
func queryOneRow() {
	s := "select * from user_tbl where id =?"
	var u user
	//确保QueryRow后调用Scan方法,否则持有的数据库不会释放
	err := db.QueryRow(s, 1).Scan(&u.id, &u.username, &u.password)
	if err != nil {
		fmt.Printf("scan failed err:%v\n", err)
		return
	} else {
		fmt.Printf("id:%d name:%s age:%s\n", u.id, u.username, u.password)
	}
	db.QueryRow(s)
}

查询多条用户信息:

func queryMultiRow() {
	sqlStr := "select id,username,password from user_tbl"
	rows, err := db.Query(sqlStr)
	if err != nil {
		fmt.Printf("query failed, err:%v\n", err)
		return
	}
	//非常重要,关闭rows释放持有的数据库连接
	defer rows.Close()

	//循环读取结果集中的数据
	for rows.Next() {
		var u user
		err := rows.Scan(&u.id, &u.username, &u.password)
		if err != nil {
			fmt.Printf("scan failed err:%v\n", err)
			return
		} else {
			fmt.Printf("id:%d name:%s age:%s\n", u.id, u.username, u.password)
		}
	}
}

请将上述代码中的usernamepasswordtcp(127.0.0.1:3306)database_nametable_nameid替换为您的实际信息和查询条件。

上述代码中的QueryRow()方法用于执行带有查询条件的查询操作,并返回一行结果。然后,我们使用Scan()方法将查询结果读取到相应的变量中。

注意:上述示例代码仅查询一行数据,如果您需要查询多行数据,则可以使用db.Query()方法,并通过遍历rows.Next()来处理多行结果。

像插入,删除,更新数据大差不差

添加数据

添加死数据

func insertData() {
	sqlStr := "insert into user_tbl(username,password) values (?,?)"
	ret, err := db.Exec(sqlStr, "张三", "123")
	if err != nil {
		fmt.Printf("insert failed,err :%v\n", err)
		return
	} else {
		i, _ := ret.LastInsertId()
		fmt.Printf("i: %v\n", i)
	}
}

通过形参添加“活”数据

func insert2(username string, password string) {
	sqlStr := "insert into user_tbl(username,password) values (?,?)"
	ret, err := db.Exec(sqlStr, username, password)
	if err != nil {
		fmt.Printf("insert failed,err :%v\n", err)
		return
	} else {
		i, _ := ret.LastInsertId()
		fmt.Printf("i: %v\n", i)
	}
}

更新数据

func update() {
	s := "update user_tbl set username=?,password=? where id=?"
	r, err := db.Exec(s, "big kite", "123456", 2)
	if err != nil {
		fmt.Printf("err:%v\n", err)
	} else {
		i, _ := r.RowsAffected()
		fmt.Printf("i: %v", i)
	}
}

删除数据

func delete(){

	s:= "delete from user_tlb where id=?"
	r,err :=db.Exec(s,1)
	if err !=nil{
		fmt.Printf("err: %v\n", err)
	}else{
		i,_ :=r.RowsAffected()
		fmt.Println("i:%v删除成功!",i)
	}
}