go-zero学习 第四章 数据库操作(MySQL)
发布人:shili8
发布时间:2025-01-24 12:39
阅读次数:0
**Go-zero 学习第四章: 数据库操作 (MySQL)**在前三章中,我们已经了解了 Go-zero 的基本框架结构、路由定义以及服务注册。然而,任何一个完整的应用都离不开数据存储。在这一章,我们将重点介绍如何使用 MySQL 作为我们的数据库。
###1. 安装依赖首先,我们需要安装 `github.com/go-sql-driver/mysql` 这个包,它是 Go-zero 支持 MySQL 的驱动器。我们可以通过以下命令来安装:
bashgo get -u github.com/go-sql-driver/mysql
###2. 配置数据库连接在我们的项目中,我们需要配置一个 `mysql` 模块来连接 MySQL 数据库。在 `main.go` 文件中添加如下代码:
gopackage mainimport (
"github.com/go-zero/core/logx"
"github.com/go-zero/zrpc/config"
"myapp/conf"
_ "github.com/go-sql-driver/mysql"
)
func init() {
logx.Load(&conf.LogConf)
}
func main() {
c, err := config.Load()
if err != nil {
logx.Panicf("load config failed: %v", err)
}
svr := NewServer(c)
svr.Start()
}
在 `conf` 包中,我们需要定义一个 `mysql` 模块来配置数据库连接:
gopackage confimport (
"github.com/go-zero/zrpc/config"
)
type LogConf struct {
Level string `mapstructure:"level"`
}
func Load() (*config.Config, error) {
c := config.NewConfig()
if err := c.Load("conf/app.toml"); err != nil {
return nil, err}
return c, nil}
在 `conf/app.toml` 文件中,我们需要配置 MySQL 的连接信息:
toml[mysql] host = "localhost" port =3306user = "root" password = "" database = "myapp"
###3. 定义数据库模型在我们的项目中,我们需要定义一个 `User` 模型来表示用户数据。我们可以使用 Go-zero 提供的 `Model` 接口来定义:
gopackage modelimport (
"github.com/go-zero/zrpc/model"
)
type User struct {
model.Model ID uint `json:"id" database:"id"`
Name string `json:"name" database:"name"`
Email string `json:"email" database:"email"`
Password string `json:"password" database:"password"`
}
###4. 实现数据库操作在我们的项目中,我们需要实现一些基本的数据库操作,如插入、查询、更新和删除。我们可以使用 Go-zero 提供的 `DB` 接口来实现:
gopackage modelimport (
"github.com/go-zero/zrpc/db"
)
func NewUserModel(c *db.DB) *User {
return &User{
Model: model.Model{DB: c},
}
}
func (m *User) Insert(user User) error {
_, err := m.DB.Exec("INSERT INTO users SET id = ?, name = ?, email = ?, password = ?", user.ID, user.Name, user.Email, user.Password)
return err}
func (m *User) Find(id uint) (*User, error) {
var user User err := m.DB.QueryRow("SELECT id, name, email, password FROM users WHERE id = ?", id).Scan(&user.ID, &user.Name, &user.Email, &user.Password)
return &user, err}
func (m *User) Update(user User) error {
_, err := m.DB.Exec("UPDATE users SET name = ?, email = ?, password = ? WHERE id = ?", user.Name, user.Email, user.Password, user.ID)
return err}
func (m *User) Delete(id uint) error {
_, err := m.DB.Exec("DELETE FROM users WHERE id = ?", id)
return err}
###5. 测试数据库操作在我们的项目中,我们需要测试一下我们实现的数据库操作。我们可以使用 Go-zero 提供的 `Test` 接口来测试:
gopackage modelimport (
"testing"
"github.com/go-zero/zrpc/test"
)
func TestUserModel(t *testing.T) {
c, err := db.NewMySQL("conf/app.toml")
if err != nil {
t.Fatal(err)
}
m := NewUserModel(c)
user := User{ID:1, Name: "John", Email: "john@example.com", Password: "password"}
err = m.Insert(user)
if err != nil {
t.Fatal(err)
}
foundUser, err := m.Find(1)
if err != nil {
t.Fatal(err)
}
if foundUser.ID !=1 || foundUser.Name != "John" || foundUser.Email != "john@example.com" || foundUser.Password != "password" {
t.Errorf("expected user {id: %d, name: %s, email: %s, password: %s}, but got {id: %d, name: %s, email: %s, password: %s}",1, "John", "john@example.com", "password", foundUser.ID, foundUser.Name, foundUser.Email, foundUser.Password)
}
err = m.Update(user)
if err != nil {
t.Fatal(err)
}
foundUser, err = m.Find(1)
if err != nil {
t.Fatal(err)
}
if foundUser.ID !=1 || foundUser.Name != "John" || foundUser.Email != "john@example.com" || foundUser.Password != "password" {
t.Errorf("expected user {id: %d, name: %s, email: %s, password: %s}, but got {id: %d, name: %s, email: %s, password: %s}",1, "John", "john@example.com", "password", foundUser.ID, foundUser.Name, foundUser.Email, foundUser.Password)
}
err = m.Delete(1)
if err != nil {
t.Fatal(err)
}
foundUser, err = m.Find(1)
if err == nil {
t.Errorf("expected error, but got none")
}
}
###6. 总结在这一章,我们学习了如何使用 MySQL 作为我们的数据库。我们了解了如何配置数据库连接、定义数据库模型和实现数据库操作。最后,我们测试了这些功能以确保它们正常工作。
通过阅读本文,希望你已经掌握了 Go-zero 使用 MySQL 的基本知识。如果你有任何问题或疑问,请随时在评论区留言。

