目录
1、Go连接Mysql
2、一般查询方法Scan
3、采用切片类型的结构体接受查询数据库信息返回的参数
4、增加
5、删除
6、修改
安装依赖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) } }
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}]
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:活着]
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)
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)
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)