目录
1、Go连接Mysql
安装依赖code:
go get -u github.com/go-sql-driver/mysql
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
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)
}
输出:[{1 活着 余华 2012-08-01}]
3、采用切片类型的结构体接受查询数据库信息返回的参数
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)
}
输出:
[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、增加
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)
}
sqlStr := `insert into book(title,author,publish_date) values("哈利波特","JK罗琳","2008-12-1")` //sql语句
insert(db, sqlStr)
5、删除
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)
}
deleteRow(db, 2)
6、修改
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)
}
updateRow(db, "余华1", 1)