go 语言中的 database/sql 包定义了对数据库的一系列操作。database/sql/driver
包定义了应被数据库驱动实现的接口,这些接口会被 sql 包使用。但是 go 语言没有提
供任何官方的数据库驱动,所以我们需要导入第三方的数据库驱动。不过我们连接数据
库之后对数据库操作的大部分代码都使用 sql 包。
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 结尾
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 命令时默
认不会执行,不过我们可以设置该函数时一个子测试函数,可以在其他测试函
我们还可以通过 testmain(m *testing.m)函数在测试之前和之后做一些其他
的操作
a) 测试文件中有 testmain 函数时,执行 go test 命令将直接运行 testmain
函数,不直接运行测试函数,只有在 testmain 函数中执行 m.run()时才
会执行测试函数
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 }
如对本文有疑问, 点击进行留言回复!!
VSCode1.4 搭建Golang的开发调试环境(遇到很多问题)
网友评论