选择驱动
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 device
sqlquery := "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 device
rows.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
}