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)
相关推荐
小码的头发丝、13 分钟前
Java进阶学习笔记|面向对象
java·笔记·学习
SEO-狼术42 分钟前
Enhance Security in Software Crack
数据库
坊钰1 小时前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
计算机毕设定制辅导-无忧学长1 小时前
Redis 初相识:开启缓存世界大门
数据库·redis·缓存
Rverdoser1 小时前
redis延迟队列
数据库·redis·缓存
阿七想学习2 小时前
数据结构《排序》
java·数据结构·学习·算法·排序算法
weisian1512 小时前
Redis篇--常见问题篇6--缓存一致性1(Mysql和Redis缓存一致,更新数据库删除缓存策略)
数据库·redis·缓存
中草药z3 小时前
【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)
java·数据库·spring boot·spring·bean·源码阅读
地球资源数据云3 小时前
全国30米分辨率逐年植被覆盖度(FVC)数据集
大数据·运维·服务器·数据库·均值算法
程序猿-瑞瑞3 小时前
24 go语言(golang) - gorm框架安装及使用案例详解
开发语言·后端·golang·gorm