执行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:访问内嵌结构体里的表名字符串