Go 语言中的 database/sql 包定义了对数据库的一系列操做。database/sql/driver
包定义了应被数据库驱动实现的接口,这些接口会被 sql 包使用。可是 Go 语言没有提
供任何官方的数据库驱动,因此咱们须要导入第三方的数据库驱动。不过咱们链接数据
库以后对数据库操做的大部分代码都使用 sql 包。mysql
package utils import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) var ( Db *sql.DB err error ) func init() { Db, err = sql.Open("mysql", "root:ygj1007502524@tcp(localhost:3306)/test") if err != nil { panic(err.Error()) } }
CREATE TABLE users( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(100) UNIQUE NOT NULL, PASSWORD VARCHAR(100) NOT NULL, email VARCHAR(100) )
package model import ( "fmt" "go_code/go-web/day01/web01_db/utils" ) //User 结构体 type User struct { ID int Username string Password string Email string } //AddUser 添加User的方法一 func (user *User) AddUser() error { //1.写sql语句 sqlStr := "insert into users(username,password,email) values(?,?,?)" //2.预编译 inStmt, err := utils.Db.Prepare(sqlStr) if err != nil { fmt.Println("预编译出现异常:", err) return err } //3.执行 _, err2 := inStmt.Exec("admin", "123456", "admin@atguigu.com") if err2 != nil { fmt.Println("执行出现异常:", err2) return err } return nil } //AddUser2 添加User的方法二 func (user *User) AddUser2() error { //1.写sql语句 sqlStr := "insert into users(username,password,email) values(?,?,?)" //2.执行 _, err := utils.Db.Exec(sqlStr, "admin2", "666666", "admin2@sina.com") if err != nil { fmt.Println("执行出现异常:", err) return err } return nil }
顾名思义,单元测试( unit test),就是一种为验证单元的正确性而设置的自动化测
试,一个单元就是程序中的一个模块化部分。通常来讲,一个单元一般会与程序中的一
个函数或者一个方法相对应,但这并非必须的。Go 的单元测试须要用到 testing 包
以及 go test 命令,并且对测试文件也有如下要求
1) 被测试的源文件和测试文件必须位于同一个包下
2) 测试文件必需要以_test.go 结尾git
package model import ( "fmt" "testing" ) //TestMain函数能够在测试函数执行以前作一些其余操做 func TestMain(m *testing.M) { fmt.Println("测试开始:") //经过m.Run()来执行测试函数 m.Run() } func TestUser(t *testing.T) { fmt.Println("开始测试User中的相关方法") //经过t.Run()来执行子测试函数 t.Run("测试添加用户:", testAddUser) } //若是函数名不是以Test开头,那么该函数默认不执行,咱们能够将它设置成为一个子测试函数 func testAddUser(t *testing.T) { fmt.Println("子测试函数执行:") user := &User{} //调用添加用户的方法 user.AddUser() user.AddUser2() }
若是一个测试函数的函数名的不是以 Test 开头,那么在使用 go test 命令时默
认不会执行,不过咱们能够设置该函数时一个子测试函数,能够在其余测试函github
咱们还能够经过 TestMain(m *testing.M)函数在测试以前和以后作一些其余
的操做web
a) 测试文件中有 TestMain 函数时,执行 go test 命令将直接运行 TestMain
函数,不直接运行测试函数,只有在 TestMain 函数中执行 m.Run()时才
会执行测试函数sql
b) 若是想查看测试的详细过程,可使用 go test -v 命令数据库
func (user *User) GetUserByID(userId int) (*User, error) { //写 sql 语句 sqlStr := "select id , username , password , email from users where id = ?" //执行 sql row := utils.Db.QueryRow(sqlStr, userId) //声明三个变量 var username string var password string var email string //将各个字段中的值读到以上三个变量中 err := row.Scan(&userId, &username, &password, &email) if err != nil { return nil, err } //将三个变量的值赋给 User 结构体 u := &User{ ID: userId, Username: username, Password: password, Email: email, } return u, nil }
func (user *User) GetUsers() ([]*User, error) { //写 sql 语句 sqlStr := "select id , username , password , email from users" //执行 sql rows, err := utils.Db.Query(sqlStr) if err != nil { return nil, err } //定义一个 User 切片 var users []*User //遍历 for rows.Next() { //声明四个个变量 var userID int var username string var password string var email string //将各个字段中的值读到以上三个变量中 err := rows.Scan(&userID, &username, &password, &email) if err != nil { return nil, err } //将三个变量的值赋给 User 结构体 u := &User{ ID: userID, Username: username, Password: password, Email: email, } //将 u 添加到 users 切片中 users = append(users, u) } return users, nil }