一.下載依賴
終端中輸入:
go get -u github.com/go-sql-driver/mysql
導入包
import ("database/sql"_ "github.com/go-sql-driver/mysql" )
?
二.案例
package main//go get-u github.com/go-sql-driver/mysql 獲取驅動
import ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"
)var db *sql.DB
//根據數據庫表中,有屬性id,name,age,且id為插入時,自增1
var usergroup map[int]user = make(map[int]user, 100)type user struct {id intname stringage int
}func initDB() (err error) {//連接數據庫dsn := "root:9826942694yzy@tcp(127.0.0.1:3306)/sql_test"db, err = sql.Open("mysql", dsn) //dsn格式不對這里會報錯if err != nil {fmt.Printf("dsn: %s invaid! err:%v\n", dsn, err)return err}//判斷一下是否連接成功err = db.Ping()if err != nil {fmt.Printf("open %s failed! err:%v\n", dsn, err)return err} else {fmt.Printf("open %s success!\n", dsn)}//設置數據庫連接池的最大連接數,根據業務調整db.SetMaxOpenConns(10)db.SetMaxIdleConns(5) //最大閑置連接數return nil
}// 輸入id,返回對應的user信息 查詢單條記錄
func queryOne(id int) (u user, err error) {//查詢單條語句sqlstr := "select * from user where id=?" //?為占位符,在Query的時候可以用后續的參數進行填充rowObj := db.QueryRow(sqlstr, id) //從數據庫連接池中拿去一個連接去進行查詢//得到了rowObj必須調用Scan方法,因為該方法會釋放數據庫連接,把連接放回連接池,否則連接池最大連接用完,則會影響后續連接查詢rowObj.Scan(&u.id, &u.name, &u.age)if rowObj == nil {fmt.Printf("query failed,err:%v\n", err)return u, err}return u, nil
}// 查詢多行 讀取到map中
func query() (err error) {sqlstr := "select * from user"rows, err := db.Query(sqlstr)if err != nil {fmt.Printf("query failed,err:%v\n", err)return}//記得關閉,放回連接池defer rows.Close()var u user//用一個for循環,把每次讀到的行信息,存放到全局變量usergroup中,達到程序啟動初始化的效果for rows.Next() {err = rows.Scan(&u.id, &u.name, &u.age)if err != nil {fmt.Printf("scan failed,err:%v\n", err)return}usergroup[u.id] = u}return nil
}// 插入一條學生數據,并且更新map id是主碼,
//實際插入學生數據的時候,并不知道數據庫中學號應該分配多少,所以在插入后得到返回的id,再更新map
func insert(u user) (id int64, err error) {sqlstr := "insert into user(name,age) values(?,?)"var res sql.Result//執行該語句res, err = db.Exec(sqlstr, u.name, u.age)if err != nil {fmt.Printf("insert failed,err:%v\n", err)return}//拿到插入的id,返回id, err = res.LastInsertId()if err != nil {fmt.Printf("insert failed,err:%v\n", err)return}return id, nil
}//刪除指定id的user,實際上最好判斷一下是否存在map中,這里就先不寫了
func deleteUser(id int) (err error) {sqlstr := "delete from user where id=?"_, err = db.Exec(sqlstr, id)if err != nil {fmt.Printf("delete failed,err:%v\n", err)return err}delete(usergroup, id)return nil
}// 查詢單條語句
func test01() {//查詢學號為1的學生信息u, err := queryOne(1)if err != nil {fmt.Printf("query failed,err:%v\n", err)return}println(u.id, u.name, u.age)}// 程序初始化時,把user表中信息全部讀取到map中
func readToMap() {//從數據庫中讀取user放入map中err := query()if err != nil {fmt.Printf("query failed,err:%v\n", err)return}
}// 測試插入
func myInsertTest() {var u useru.age = 23u.name = "周杰倫"id, err1 := insert(u)if err1 != nil {fmt.Printf("insert failed,err:%v\n", err1)return}//說明插入成功u.id = int(id)usergroup[u.id] = u
}//遍歷map
func printMap() {//遍歷for _, u := range usergroup {println(u.id, u.name, u.age)}println("***************************************")
}func main() {err := initDB()defer db.Close()if err != nil {fmt.Printf("init db failed,err:%v\n", err)return}readToMap()printMap()myInsertTest()printMap()}