第6课:对Mysql的增删改查操作

对于任意一门语言,对数据库的操作都是基本功能,也是项目的基石

go官方仅提供了database package,database package下有两个包sql,sql/driver。这两个包用来定义操作数据库的接口,这就保证了无论使用哪种数据库,他们的操作方式都是相同的。
但go官方并没有提供连接数据库的driver,如果要操作数据库,还需要第三方的driver 包,幸好,主流的数据库的driver都已经有了:https://code.google.com/p/go-wiki/wiki/SQLDrivers
其中,mysql有两个包,一个是mymysql,一个是go-sql-driver/mysql,两个package都是纯go实现。我选择了后者,因为后者的效率更高一点,benchmark在这里:https://github.com/go-sql-driver/sql-benchmark

话不多说,直接用例子来说明

/*
DB的主要方法有:
Query 执行数据库的Query操作,例如一个Select语句,返回*Rows
QueryRow 执行数据库至多返回1行的Query操作,返回*Row
PrePare 准备一个数据库query操作,返回一个*Stmt,用于后续query或执行。这个Stmt可以被多次执行,或者并发执行
Exec 执行数不返回任何rows的据库语句,例如delete操作
Stmt的主要方法:
Exec
Query
QueryRow
Close
用法与DB类似
Rows的主要方法:
Cloumns: 返回[]string,column names
Scan:
Next:
Close:
*/
package main

import (
	"database/sql"
	"fmt"
	_ "github.com/Go-SQL-Driver/Mysql"
)

// 用户结构
type User struct {
	uid      int
	username string
	password string
}

func main() {
	db, err := sql.Open("mysql", "root:@/test?charset=utf8")
	checkErr(err, "连接成功")

	stmt, err := db.Prepare("INSERT into userinfo (username, departname, created) values (?,?,?)")
	res, err := stmt.Exec("godeye", "研发部门", "2014-12-09")
	checkErr(err, "插入成功")
	fmt.Println(res)

	stmt, err = db.Prepare("UPDATE userinfo set username=? where uid=?")
	res, err = stmt.Exec("godeyeorg", 12)
	affect, err := res.RowsAffected()
	checkErr(err, "更新成功")
	fmt.Println(affect)

	//查询数据
	rows, err := db.Query("SELECT * FROM userinfo")
	for rows.Next() {
		var uid int
		var username string
		var department string
		var created string
		err = rows.Scan(&uid, &username, &department, &created)
		checkErr(err, "查询")
		fmt.Println(uid)
		fmt.Println(username)
		fmt.Println(department)
		fmt.Println(created)
	}

	//删除数据
	stmt, err = db.Prepare("delete from userinfo where uid=?")
	res, err = stmt.Exec(30)
	fmt.Println(res)
	db.Close()
}

func checkErr(err error, msg string) {
	if err != nil {
		panic(err)
	} else {
		fmt.Println(msg)
	}
}