选择驱动
go get -u github.com/go-sql-driver/mysql
使用
参考文档database/sql 模块.
sql包提供了保证SQL或类SQL数据库的泛用接口。意味着其他的数据库(非mysql)操作都能使用此库操作
import ("database/sql""fmt"_ "github.com/go-sql-driver/mysql" // init()方法被执行)func main() {DB, err := sql.Open("mysql", "username:password@tcp(ip:port)/database") // 此处不会校验账号密码是否对。下面ping才会if err != nil {fmt.Println(err)return}// 校验是否成功err = DB.Ping()if err != nil {fmt.Println("数据库连接错误")}}
查询
func query(id int) {var dev devicesqlquery := "select id , type from device where id = ?"db.QueryRow(sqlquery, id).Scan(&dev.id, &dev.name) // 必须要调用Scan 用来释放资源。fmt.Printf("获取的设备%v \n", dev)}
查询多个数据
func queryMore(id int) (err error) {sqlquery := "select id , type from device where id < ?"rows, err := db.Query(sqlquery, id) // 必须要调用Scan 用来释放资源。if err != nil {return}defer rows.Close()for rows.Next() {var dev devicerows.Scan(&dev.id, &dev.name)fmt.Printf("获取的设备%v \n", dev)}return}
新增
func insert(hot *hotel) {inserSQL := "INSERT INTO hotel ( hotelid, roomno, userid, datatime) VALUES (?,?, NULL, NULL)"result, err := db.Exec(inserSQL, *&hot.id, *&hot.name)if err != nil {return}insertid, err := result.LastInsertId()fmt.Printf("插入结果%v \n ", insertid)}
预处理
预先让数据库解析sql.之后替换sql的参数数据,加快速度。防止sql注入
func insertP() (err error) {inserSQL := "INSERT INTO wenshu_hotel ( hotelid, roomno, userid, datatime) VALUES (?,?, NULL, NULL)"stmt, err := db.Prepare(inserSQL)if err != nil {return}defer stmt.Close()var testData = map[int]string{12: "测四1",13: "测试2",}for k, v := range testData {stmt.Exec(k, v)}return}
