go-zero 操作 mysql
在 go-zero
中操作 mysql
数据库,先通过 goctl
生成 model
文件,然后通过 model
文件操作数据库
具体的操作方式如下:
- 通过
sql
文件生成model
文件 - 数据库连接
- 操作
model
,修改业务逻辑
通过 sql 文件生成 model 文件
先定义 user.sql
文件:
sql
复制代码
create table user ( id bigint AUTO_INCREMENT, username varchar(36) NOT NULL, password varchar(64) default "", UNIQUE name_index (username), PRIMARY KEY (id) ) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
然后通过这个 user.sql
生成 model
文件
bash
复制代码
goctl model mysql ddl --src user.sql --dir .
数据库连接
在 etcd/user.yaml
中配置数据库连接信息
yaml
复制代码
Mysql: DataSource: root:123456@tcp(go-uccs:3306)/zero_study?charset=utf8mb4&parseTime=True&loc=Local
在 internal/config/config.go
中增加数据库的配置参数
go
复制代码
type Config struct { rest.RestConf Mysql struct { DataSource string } }
在 internal/srv/servicecontext.go
中增加数据库的连接方式,这里的 user
是 user.sql
文件生成的 model
go
复制代码
type ServiceContext struct { Config config.Config UsersModel user.UserModel } func NewServiceContext(c config.Config) *ServiceContext { mysqlConn := sqlx.NewMysql(c.Mysql.DataSource) return &ServiceContext{ Config: c, UsersModel: user.NewUserModel(mysqlConn), } }
修改业务逻辑
在 internal/handler/loginhandler.go
文件中就可以调用 model
中的相关方法完成业务逻辑了
调用 model
中的方法是通过 l.svcCtx.UsersModel
调用
go
复制代码
func (l *LoginLogic) Login(req *types.LoginRequest) (resp string, err error) { user, err := l.svcCtx.UsersModel.FindOneByUsernameAndPassword(l.ctx, req.UserName, req.Password) if err != nil { return "", errors.New("登录失败") } return user.Username, nil }
go-zero 接入 gorm
gorm
是目前最流行的 orm
框架,相比 go-zero
再带的 sqlx
,gorm
操作数据库更加方便
go-zero
支持接入 gorm
,具体的操作方式如下:
- 准备
gorm
连接数据库的配置,在etc/users.yaml
中增加mysql
的配置yaml
复制代码
Mysql: DataSource: root:123456@tcp(go-uccs-1:3306)/zero_study?charset=utf8mb4&parseTime=True&loc=Local
- 准备
gorm
连接数据库的方法go
复制代码
func InitGorm(MysqlDataSource string) *gorm.DB { db, err := gorm.Open(mysql.Open(MysqlDataSource), &gorm.Config{}) if err != nil { panic("连接 mysql 数据库失败:" + err.Error()) } else { fmt.Println("连接数据库成功") } db.AutoMigrate(&user.UserModel{}) return db }
- 在配置文件中增加
mysql
的结构体go
复