Go原生提供了连接数据库操作的支持,在用 Golang进行开发的时候,如果需要在和数据库交互,则可以使用database/sql包。这是一个对关系型数据库的通用抽象,它提供了标准的、轻量的、面向行的接口。
sql包提供了保证SQL或类SQL数据库的泛用接口。 使用sql包时必须注入(至少)一个数据库驱动。
使用的驱动为: github.com/go-sql-driver/mysql 导入的包
"database/sql"
_ "github.com/go-sql-driver/mysql"
在连接mysql之前,先准备一个数据库和一张表 数据库为test 表结构
create table users (
`id` int PRIMARY KEY auto_increment,
`username` VARCHAR(100) not null unique,
`password` VARCHAR(100) not NULL,
`email` VARCHAR(100) not null
)
- 连接数据库
创建utils/db.go
package utils
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
var (
Db *sql.DB
err error
)
func init() {
Db, err = sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/test")
if err != nil {
fmt.Println("mysql connect failed err: ", err.Error())
panic(err.Error())
}
}
2.创建model/user.go
package model
import (
"fmt"
"go-web-book-shop/utils"
)
type User struct {
ID int
Username string
Password string
Email string
}
func (user *User) AddUser() error {
sql := "insert into users(username, password, email) values (?, ?, ?)"
insertStmt, err := utils.Db.Prepare(sql)
if err != nil {
fmt.Println("预编译出现异常: ", err)
return err
}
_, err = insertStmt.Exec("admin3", "123456", "zhangsan@163.com")
if err != nil {
fmt.Println("数据写入失败: ", err)
return err
}
return nil
}
func (user *User) AddUser2() error {
sql := "insert into users(username, password, email) values (?, ?, ?)"
_, err := utils.Db.Exec(sql, "admin4", "123456", "lisi@163.com")
if err != nil {
fmt.Println("数据写入失败!: ", err)
return err
}
return nil
}
func (user *User) Del() error {
sql := "delete from users where id = ?"
stmt, err := utils.Db.Prepare(sql)
if err != nil {
fmt.Println("预编译失败...")
return err
}
_, err = stmt.Exec(4)
if err != nil {
fmt.Println("执行删除语句失败")
return err
}
return nil
}
func (user *User) UpdateUserById() error {
sql := "update users set username = ?, password = ?, email = ? where id = ?"
stmt, err := utils.Db.Prepare(sql)
if err != nil {
fmt.Println("预编sql失败: ", err)
return err
}
_, err = stmt.Exec("admin", "123456", "123456@163.com", 4)
if err != nil {
fmt.Println("执行修改sql语句失败: ", err)
return err
}
return nil
}
func (user *User) QueryOne() (*User, error) {
sql := "select * from users where id = ?"
row := utils.Db.QueryRow(sql, user.ID)
var id int
var username string
var password string
var email string
err := row.Scan(&id, &username, &password, &email)
if err != nil {
fmt.Println("查询失败:", err)
return nil, err
}
u := &User{
ID: id,
Username: username,
Password: password,
Email: email,
}
return u, nil
}
func (user *User) QueryAll() ([]*User, error) {
sql := "select * from users"
rows, err := utils.Db.Query(sql)
if err != nil {
fmt.Println("执行sql语句失败: ", err)
return nil, err
}
var users []*User
for rows.Next() {
var id int
var username string
var password string
var email string
err = rows.Scan(&id, &username, &password, &email)
if err != nil {
return nil, err
}
u := &User{
ID: id,
Username: username,
Password: password,
Email: email,
}
users = append(users, u)
}
return users, nil
}
3.创建model/user_test.go单元测试文件
package model
import (
"fmt"
"testing"
)
func TestMain(m *testing.M) {
m.Run()
}
func TestUser(t *testing.T) {
fmt.Println("开始测试User中的相关的方法")
t.Run("测试添加用户", testUser_QueryAll)
}
func testUser_AddUser(t *testing.T) {
fmt.Println("测试添加用户...")
user := &User{}
user.AddUser()
user.AddUser2()
}
func testUser_Del(t *testing.T) {
fmt.Println("测试删除用户...")
user := &User{}
user.Del()
}
func testUser_UpdateUserById(t *testing.T) {
fmt.Println("测试通过ID修改用户信息...")
user := &User{}
user.UpdateUserById()
}
func testUser_QueryOne(t *testing.T) {
fmt.Println("测试查询一条数据...")
user := &User{
ID: 15,
}
u, _ := user.QueryOne()
fmt.Println("查询id为15的记录为: ", u)
}
func testUser_QueryAll(t *testing.T) {
fmt.Println("测试获取所有的数据...")
user := User{}
users, _ := user.QueryAll()
for k, v := range users{
fmt.Printf("第%d个用户是: %v: \n", k+1, v)
}
}
4.执行单元测试 go test
|