go-zero-理解model 文件设计思路

执行goctl model,以user模块为例,会生成xsusersmodel_gen.go、xsusersmodel.go文件。

其中xsusersmodel_gen.go是自动生成文件,里面封装了基本的增删改查sql操作。如果编辑数据库字段,重新执行goctl model会覆盖,所以在该文件里禁止手动修改。

但是,如果要写自定义的sql操作,怎么办呢?

所以就会有xsusersmodel_gen.go文件,即自定义扩展文件,专门写自己的业务方法。

封装逻辑

定义接口 xsUsersModel,只定义增删改查行为,而具体的实现方法写在结构体 defaultXsUsersModel

然后自定义的方法写在customXsUsersModel结构体里。并内嵌默认结构体defaultXsUsersModel

type customXsUsersModel struct {
    *defaultXsUsersModel
}

注意是匿名内嵌,主要目的使defaultXsUsersModel 的 Insert/FindOne/Update/Delete 会直接变成 customXsUsersModel 的方法,调用时不用加字段名:

而且通过这种方式,customXsUsersModel 也自动拥有内层 defaultXsUsersModel 的所有字段:m.conn、m.table

defaultXsUsersModel struct {
	conn  sqlx.SqlConn
	table string
}

外部传入 conn 给 NewXsUsersModel(conn),后续任何 custom 的方法,通过 default的conn 就能拿到当初传进来的连接。

func (m *customXsUsersModel) CountUsers(ctx context.Context) (int64, error) {
	var count int64
	query := fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `deleted` = 0", m.table)
	err := m.conn.QueryRowCtx(ctx, &count, query)
	return count, err
}

m 是 *customXsUsersModel 实例,m.conn:访问到内嵌 defaultXsUsersModel 里保存的数据库连接,m.table:访问内嵌结构体里的表名字符串