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 的基本知识。如果你有任何问题或疑问,请随时在评论区留言。