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)
相关推荐
python资深爱好者2 分钟前
NoSQL数据库与关系型数据库的主要区别
数据库·oracle·nosql
sj11637394038 分钟前
Kafka参数了解
数据库·分布式·kafka
一只特立独行的程序猿12 分钟前
关于GCC内联汇编(也可以叫内嵌汇编)的简单学习
汇编·学习·gcc
@东辰14 分钟前
【golang-技巧】-自定义k8s-operator-by kubebuilder
开发语言·golang·kubernetes
虾球xz17 分钟前
游戏引擎学习第10天
学习·游戏引擎
Chef_Chen20 分钟前
从0开始学习机器学习--Day25--SVM作业
学习·机器学习·支持向量机
L_cl28 分钟前
Python学习从0到1 day28 Python 高阶技巧 ⑧ 递归
学习
vortex51 小时前
Vim 编辑器学习笔记
学习·编辑器·vim
源于花海1 小时前
论文学习(四) | 基于数据驱动的锂离子电池健康状态估计和剩余使用寿命预测
论文阅读·人工智能·学习·论文笔记
心怀梦想的咸鱼1 小时前
Ue5 umg学习(一)
学习·ue5