Go学习(四):golang连接mysql数据库查询数据库信息

目录

1、Go连接Mysql

2、一般查询方法Scan

3、采用切片类型的结构体接受查询数据库信息返回的参数

4、增加

5、删除

6、修改


1、Go连接Mysql

安装依赖code

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

Go 复制代码
package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql" //导入包但不使用,init()
)

func main() {
	//Go连接Mysql
	//用户名:密码啊@tcp(ip:端口)/数据库的名字
	dsn := "root:密码@tcp(127.0.0.1:3306)/数据库的名字"
	//连接数据集
	db, err := sql.Open("mysql", dsn) //open不会检验用户名和密码
	if err != nil {
		fmt.Printf("dsn:%s invalid,err:%v\n", dsn, err)

	}
	err = db.Ping() //尝试连接数据库
	if err != nil {
		fmt.Printf("open %s faild,err:%v\n", dsn, err)
	}
	fmt.Println("连接数据库成功~")
	if err != nil {
		fmt.Printf("init DB failed,err%v\n", err)
	}
	

}

2、一般查询方法Scan

Go 复制代码
package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql" //导入包但不使用,init()
)

// Book 书籍
type Book struct {
	BookId      int    // 书籍 ID
	Title       string // 书名
	Author      string // 作者
	PublishDate string // 出版日期
}

// 查询数据一般使用 Scan
// 缺点,不通用,不同的表的查询需要定义不同的结构体,然后写不同的 Scan。
func searchBook1(db *sql.DB) ([]Book, error) {
	var books []Book
	//查询语句
	sql := `select book_id,title,quthor,to_char(publish_date, 'YYYY/MM/DD') as publish_date from book`
	rows, err := db.Query(sql)
	if err != nil {
		log.Panicln(err)
		return books, err
	}
	defer rows.Close() //这个语句干吗的
	for rows.Next() {
		var book Book
		// 获取各列的值,放到对应的地址中
		rows.Scan(&book.BookId, &book.Title, &book.Author, &book.PublishDate)
		books = append(books, book)
	}
	return books, nil
}

func main() {
	//Go连接Mysql
	//用户名:密码啊@tcp(ip:端口)/数据库的名字
	dsn := "root:密码@tcp(127.0.0.1:3306)/数据库的名字"
	//连接数据集
	db, err := sql.Open("mysql", dsn) //open不会检验用户名和密码
	if err != nil {
		fmt.Printf("dsn:%s invalid,err:%v\n", dsn, err)

	}
	err = db.Ping() //尝试连接数据库
	if err != nil {
		fmt.Printf("open %s faild,err:%v\n", dsn, err)
	}
	fmt.Println("连接数据库成功~")
	if err != nil {
		fmt.Printf("init DB failed,err%v\n", err)
	}
	searchBook1(db)

}
Go 复制代码
输出:[{1 活着 余华 2012-08-01}] 

3、采用切片类型的结构体接受查询数据库信息返回的参数

Go 复制代码
package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql" //导入包但不使用,init()
)

// Book 书籍
type Book struct {
	BookId      int    // 书籍 ID
	Title       string // 书名
	Author      string // 作者
	PublishDate string // 出版日期
}


// 采用切片类型的结构体接受查询数据库信息返回的参数
func searchBook2(db *sql.DB, sSql string) ([]map[string]interface{}, error) {
	// 准备查询语句
	stmt, err := db.Prepare(sSql)
	if err != nil {
		log.Println(err)
		return nil, err
	}
	defer stmt.Close()

	// 查询
	rows, err := stmt.Query()
	if err != nil {
		log.Println(err)
		return nil, err
	}
	defer rows.Close()
	// 数据列
	columns, err := rows.Columns()
	if err != nil {
		log.Println(err)
		return nil, err
	}

	// 列的个数
	count := len(columns)

	// 返回值 Map切片
	mData := make([]map[string]interface{}, 0)
	// 一条数据的各列的值(需要指定长度为列的个数,以便获取地址)
	values := make([]interface{}, count)
	// 一条数据的各列的值的地址
	valPointers := make([]interface{}, count)
	for rows.Next() {

		// 获取各列的值的地址
		for i := 0; i < count; i++ {
			valPointers[i] = &values[i]
		}

		// 获取各列的值,放到对应的地址中
		rows.Scan(valPointers...)
		fmt.Println(valPointers)
		fmt.Println(values)
		// 一条数据的Map (列名和值的键值对)
		entry := make(map[string]interface{})

		// Map 赋值
		for i, col := range columns {
			var v interface{}

			// 值复制给val(所以Scan时指定的地址可重复使用)
			val := values[i]
			fmt.Println(val)
			b, ok := val.([]byte)
			if ok {
				// 字符切片转为字符串
				v = string(b)
			} else {
				v = val
			}
			entry[col] = v
			fmt.Println(entry)
		}

		mData = append(mData, entry)
	}

	return mData, nil
}

func main() {
	//Go连接Mysql
	//用户名:密码啊@tcp(ip:端口)/数据库的名字
	dsn := "root:密码@tcp(127.0.0.1:3306)/数据库的名字"
	//连接数据集
	db, err := sql.Open("mysql", dsn) //open不会检验用户名和密码
	if err != nil {
		fmt.Printf("dsn:%s invalid,err:%v\n", dsn, err)

	}
	err = db.Ping() //尝试连接数据库
	if err != nil {
		fmt.Printf("open %s faild,err:%v\n", dsn, err)
	}
	fmt.Println("连接数据库成功~")
	if err != nil {
		fmt.Printf("init DB failed,err%v\n", err)
	}
	sql := "select book_id, title, author,publish_date from book"
	searchBook2(db, sql)

}

输出:

Go 复制代码
[0xc0000a2080 0xc0000a2090 0xc0000a20a0 0xc0000a20b0]
[1 [230 180 187 231 157 128] [228 189 153 229 141 142] [50 48 49 50 45 48 56 45 48 49]]
1
map[book_id:1]
[230 180 187 231 157 128]
map[book_id:1 title:活着]
[228 189 153 229 141 142]
map[author:余华 book_id:1 title:活着]
[50 48 49 50 45 48 56 45 48 49]
map[author:余华 book_id:1 publish_date:2012-08-01 title:活着]

4、增加

Go 复制代码
func insert(db *sql.DB, sqlStr string) {

	ret, err := db.Exec(sqlStr) //执行sql语句
	if err != nil {
		fmt.Printf("insert failed,err:%v\n", err)
		return
	}
	//如果是插入数据的操作,能够拿到插入数据的id
	id, err := ret.LastInsertId()
	if err != nil {
		fmt.Printf("get id failed,err:%v\n", err)
		return
	}
	fmt.Println("id", id)
}
Go 复制代码
sqlStr := `insert into book(title,author,publish_date) values("哈利波特","JK罗琳","2008-12-1")` //sql语句
insert(db, sqlStr)

5、删除

Go 复制代码
func deleteRow(db *sql.DB, id int) {
	sqlStr := `delete from book where book_id=?`
	ret, err := db.Exec(sqlStr, id)
	if err != nil {
		fmt.Printf("delete faild,err:%v\n", err)
		return
	}
	n, _ := ret.RowsAffected()
	fmt.Printf("删除了%d行数据\n", n)

}
Go 复制代码
deleteRow(db, 2)

6、修改

Go 复制代码
func updateRow(db *sql.DB, au string, id int) {
	sqlStr := `update book set author=? where book_id=?`
	ret, err := db.Exec(sqlStr, au, id)
	if err != nil {
		fmt.Printf("update failed ,err:%v\n", err)
		return
	}
	n, _ := ret.RowsAffected()
	fmt.Printf("更新了%d行数据\n", n)
}
Go 复制代码
updateRow(db, "余华1", 1)
相关推荐
movie__movie4 分钟前
Spring AI MCP 客户端实战:轻松连接高德地图等工具
数据库·人工智能·spring
清风19816 分钟前
kafka消息可靠性传输语义
数据库·分布式·kafka
褚翾澜41 分钟前
Ruby语言的代码重构
开发语言·后端·golang
数据智能老司机2 小时前
CockroachDB权威指南——SQL调优
数据库·分布式·架构
数据智能老司机2 小时前
CockroachDB权威指南——应用设计与实现
数据库·分布式·架构
数据智能老司机3 小时前
CockroachDB权威指南——CockroachDB 模式设计
数据库·分布式·架构
数据智能老司机21 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机1 天前
CockroachDB权威指南——开始使用
数据库·分布式·架构
云上艺旅1 天前
K8S学习之基础七十四:部署在线书店bookinfo
学习·云原生·容器·kubernetes
松果猿1 天前
空间数据库学习(二)—— PostgreSQL数据库的备份转储和导入恢复
数据库