选择驱动

  1. go get -u github.com/go-sql-driver/mysql

使用

参考文档database/sql 模块.
sql包提供了保证SQL或类SQL数据库的泛用接口。意味着其他的数据库(非mysql)操作都能使用此库操作

  1. import (
  2. "database/sql"
  3. "fmt"
  4. _ "github.com/go-sql-driver/mysql" // init()方法被执行
  5. )
  6. func main() {
  7. DB, err := sql.Open("mysql", "username:password@tcp(ip:port)/database") // 此处不会校验账号密码是否对。下面ping才会
  8. if err != nil {
  9. fmt.Println(err)
  10. return
  11. }
  12. // 校验是否成功
  13. err = DB.Ping()
  14. if err != nil {
  15. fmt.Println("数据库连接错误")
  16. }
  17. }

查询

  1. func query(id int) {
  2. var dev device
  3. sqlquery := "select id , type from device where id = ?"
  4. db.QueryRow(sqlquery, id).Scan(&dev.id, &dev.name) // 必须要调用Scan 用来释放资源。
  5. fmt.Printf("获取的设备%v \n", dev)
  6. }

查询多个数据

  1. func queryMore(id int) (err error) {
  2. sqlquery := "select id , type from device where id < ?"
  3. rows, err := db.Query(sqlquery, id) // 必须要调用Scan 用来释放资源。
  4. if err != nil {
  5. return
  6. }
  7. defer rows.Close()
  8. for rows.Next() {
  9. var dev device
  10. rows.Scan(&dev.id, &dev.name)
  11. fmt.Printf("获取的设备%v \n", dev)
  12. }
  13. return
  14. }

新增

  1. func insert(hot *hotel) {
  2. inserSQL := "INSERT INTO hotel ( hotelid, roomno, userid, datatime) VALUES (?,?, NULL, NULL)"
  3. result, err := db.Exec(inserSQL, *&hot.id, *&hot.name)
  4. if err != nil {
  5. return
  6. }
  7. insertid, err := result.LastInsertId()
  8. fmt.Printf("插入结果%v \n ", insertid)
  9. }

预处理

预先让数据库解析sql.之后替换sql的参数数据,加快速度。防止sql注入

  1. func insertP() (err error) {
  2. inserSQL := "INSERT INTO wenshu_hotel ( hotelid, roomno, userid, datatime) VALUES (?,?, NULL, NULL)"
  3. stmt, err := db.Prepare(inserSQL)
  4. if err != nil {
  5. return
  6. }
  7. defer stmt.Close()
  8. var testData = map[int]string{
  9. 12: "测四1",
  10. 13: "测试2",
  11. }
  12. for k, v := range testData {
  13. stmt.Exec(k, v)
  14. }
  15. return
  16. }

事务