Go微服务实践之增删改查
从此篇文章开始,我们来陆续介绍
go-zero
开发一个项目所需要的组件和开发实践。
首先我们从 model
层开始,来说说go-zero
的API以及封装细节。首先 model
层连接的API集中在core/stores
。我们先来看看操作 mysql
这类数据库,API方法我们来到 core/stores/sqlx
,所以接下来用几篇的文章总体介绍一下 sqlx
的使用和设计思想。
快速使用
func main() { // 1 const datasource = "user:password@/dbname" mysqlDB := sqlx.NewMysql(datasource) // 2 um := model.NewUserModel(mysqlDB,"User") // 3 ul := logic.NewUserLogic(um) // 4 engine.AddRoutes(nginxApi(ul)) engine.Start() } // NewUserModel,NewUserLogic 类似 func NewUserModel(conn sqlx.SqlConn, table string) *UserModel { return &UserModel{conn: conn, table: table} } // nginxApi将logic注入到handle,同时绑定路由和handler func nginxApi(ul *logic.UserLogic) []rest.Route { return []rest.Route{ { Method: http.MethodGet, Path: "/user/:id", // /user/54er6; Handler: handler.NewUserHandler(ul).GetUserById, } }
总结一下:
NewMysql
创建数据库连接- 创建相应的
model
,并将连接传入「相应的NewModel
需要开发者编写」 model
是为上一层logic
提供服务- 将
logic
注入到handler
中,同时handler
与路由绑定,开启Server
这样 model-logic-handler
最简单的结构就出来了。然后来看看在 model
层如何进行数据操作:
var userBuilderQueryRows = strings.Join(builderx.FieldNames(&User{}), ",") type User struct { Avatar string `db:"avatar"` // 头像 UserName string `db:"user_name"` // 姓名 Sex int `db:"sex"` // 1男,2女 MobilePhone string `db:"mobile_phone"` // 手机号 } func (um *UserModel) Insert(user *User) (int64, error) { const insertsql = `insert into `+um.table+` (`+userBuilderQueryRows+`) values(?, ?, ?)` // insert「delete使用方式一致」 res, err := um.conn.Exec(insertsql, user.Avatar, user.UserName, user.Sex, user.MobilePhone) if err != nil { logx.Errorf("insert User Position Model Model err, err=%v", err) return -1, err } id, err := res.LastInsertId() if err != nil { logx.Errorf("insert User Model to Id parse id err,err=%v", err) return -1, err } return id, nil } func (um *UserModel) FindOne(uid int64) (*User, error) { var user User // query const querysql = `select `+userBuilderQueryRows+` from `+um.table+` where id=? limit 1` err := um.conn.QueryRow(&user, querysql, uid) if err != nil { logx.Errorf("userModile.findOne error ,id=%d,err=%s", uid, err.Error()) if err == sqlx.ErrNotFound { return nil, ErrNotFound } return nil, err } return &user, nil }
insert/update/delete
:conn.Exec(insertsql/updatesql/deletesql, args...)
query
:conn.QueryRow(&model, querysql, args...)
上述就是最简单的 crud
的结构:首先是构建 model
,然后操作 model
进行操作。
代码结构
文件名 | 作用 |
---|---|
bulkinserter.go | 批量插入 |
mysql.go | NewMysql |
orm.go | 解析,序列化model 的操作 |
sqlconn.go | 抽象crud 操作的接口 |
tx.go | 事务操作 |
从 sqlconn.go
的相互接口关系:
可以看出:commonSqlConn
和 txSession
是真正实现的地方。先从 API
的功能整体介绍一下:
API | 参数 | 作用 |
---|---|---|
Exec(query, args...) | sql, sql参数 | insert/update/delete |
Prepare(query) | sql | 预编译sql |
QueryRow(&model, query, args...) | model, sql, sql参数 | 查询一行数据同时赋值给「model」 |
QueryRowPartial(&model, query, args...) | model, sql, sql参数 | 功能同上,但是select sql可以只选取model的部分column「映衬Partial」 |
QueryRows/QueryRowsPartial | 同上 | 查询多行API |
Transact(func(session Session) error) | 事务操作 | 将参数中的操作用事务包裹,开发者只需专注参数中的函数编写 |
总结
go-zero
的 sqlx
屏蔽了go原生的sql操作,开发者只需关注sql编写和业务封装的数据对象,不需要像原生开发中需要手动prepare,赋值数据时Scan。
本节只是简略介绍了接口的相互关系以及开发者平时关注的API,下节将着重分析go-zero是怎么帮你赋值数据,同时在并发大的情况下,如何不让流量直接把你的数据库打死。
参考
欢迎大家使用 go-zero
项目地址:
https://github.com/tal-tech/go-zero
https://gitee.com/kevwan/go-zero
如果觉得文章不错,欢迎 github 点个 star 🤝

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
极限编程中的计划游戏(Planning Game)怎么玩?
在极限编程中,计划游戏是研发团队与利益相关者举行的计划会议,包括两部分:发布计划和迭代计划。客户以及团队中的所有开发人员都要参加。计划游戏对团队有什么作用?快扫图片二维码观看吧。 视频地址:https://www.zentao.net/xp/planning-game-80295.html/?u=uplu&f=kyzg 极限编程的计划游戏与Scrum的计划会议大同小异,计划游戏的发布计划与迭代计划都分别包括了探索、承诺和指导3个阶段。 发布计划 在探索阶段,由客户整理用户故事,写在用户故事卡上。开发人员估算每个用户故事的所需工时,并将估算值写在故事卡上。如果个别用户故事无法估算,则由客户重新分解之后,再由开发人员进行估算。 在承诺阶段,客户根据商业价值来对用户故事进行分类排序,研发人员则按风险来对用户故事分类排序,并确认开发速度。 最后由客户选择在下个版本发布时,要完成的用户故事。在指导阶段,开发人员和客户可以调整、修改计划。比如用户故事的优先级可能会发生变化、估时可能存在偏差等。这是相应调整计划的机会 迭代计划 迭代计划是发布计划的进一步计划,在探索阶段,团队讨论每个用户故事...
- 下一篇
【直播预告】Gitee 产品经理开讲!教你使用 Gitee Go 构造高效流水线
Gitee自研 CI/CD 工具 Gitee Go 正式上线后,我们收到了许多用户的反馈。 经过近期不断地改进,现在我们把它介绍给更多 Gitee 用户。 什么是 Gitee Go,它能做些什么? 如何使用 Gitee Go 把流水线真正地「跑起来」? 即将到来的 Gitee Talk 第三期 看 Gitee 产品经理带你玩转 Gitee Go,打造高效 CI/CD 流水线。 直播时间 12 月 9 日晚 19:30-20:30 讲师 Gitee Go 产品经理 张盛翔 互动福利 参与直播互动可获得企业版优惠,还有机会获赠奖品,文化衫、鼠标垫等礼品等你拿。 参与方式 扫描下方二维码,加入官方直播群,群内将为大家推送直播链接。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7设置SWAP分区,小内存服务器的救世主
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题