本文攻略:独立全栈开发一个项目,实现 Restful 接口,实现 Web 服务,实现数据库增删改查(CRUD)

建议玩家等级:技术小白,学生党,初级码农

阅读此文先解锁技能:

  1. 一点点命令行基础
  2. 一点点 GO 基础:三天包学会
  3. 一点点 Restful API 基础
  4. 一点点 MongoDB 基础:一天包学会
  5. 一点点全栈开发知识:5分钟学会全栈开发

实践此文推荐装备:

  1. 操作系统:macOS Sierra(Windows也没毛病)
  2. IDE:VSCode
  3. Restful API 工具:Paw、Postman 或者 Swagger Editor
  4. 数据库:MongoDB

PART 1: 增删改查的前世今生 What is CRUD

全栈开发这件事,其本质是把数据从前端开始,翻山越岭,历经81难,最终运送到数据库的过程。

举个栗子,几乎每个商业项目都会有分类(Category)模块,假设星巴克有4种商品分类:咖啡、甜品、三明治、茶瓦纳。

而伴随着分类数据一起诞生的是数据操作孪生四兄弟:增删改查(CRUD)。学过数据库的玩家对这四个家伙那一定是又爱又恨。

  1. 增(Create):增加一个分类,从无到有
  2. 删(Delete):删除一个分类,从有变无
  3. 改(Update):修改一个分类,已存在的分类,只是内容变了
  4. 查(Retrieve):查询一个分类的一切内容

在全栈开发的每一个栈里,我们都将和操作四兄弟(CRUD)形影不离。

本篇文章会暂时先忽略前端实现增删改查的细节,直接从前端调用 Restful API 说起,关于前端开发实现会在下篇文章着重全篇讲解

PART 2: 增删改查的前端数据起点 - Restful API

栗子中,假设一个分类数据 ‘咖啡’ 已被前端操作完毕,放在了 Restful API 邮政局门口准备被 HTTP 运送去被指定的后端(云端)数据加工厂,HTTP 运送 ’咖啡‘ 分类的时候会严格按照 Restful 邮政标准流程,流程中规定了其中两件很重要的事:

  • HTTP 使用 URL 规范告诉数据加工厂,这条 ‘咖啡’ 分类数据将被送到工厂里处理 ‘分类’ 的部门
  • HTTP 使用 Method 规范告诉数据加工厂,这条 ‘咖啡’ 分类数据将在处理 ‘分类’ 部门中进行增删改查(CRUD)中的哪个加工操作

于是我们实现4个 Restful API,分别对应分类(Category)的增删改查(CRUD)4个操作:

  1. 增。HTTP URL:http://{加工厂地址}/api/category/Add,HTTP Method:POST
  2. 删。HTTP URL:http://{加工厂地址}/api/category/edit,HTTP Method:DELETE
  3. 改。HTTP URL:http://{加工厂地址}/api/category/remove,HTTP Method:PUT
  4. 查。HTTP URL:http://{加工厂地址}/api/category/list,HTTP Method:GET

后端加工厂可以是一个体系结构简单的传统小作坊,也可以是一个体系结构及其大而复杂的现代化智能工厂。这取决于后端程序处理的具体业务逻辑需求以及后端程序架构师的设计,这又是一个很大的范畴,本篇文章不做详细讲解。

PART 3: 增删改查的后端数据加工厂 - GO

我们的后端加工厂用了一种常见的架构叫做MVC(Model-View-Controller),简单易用我们将加工厂分为以下几个部门一起协同工作:

1. Web 服务部门

这是个炒鸡忙碌的部门,他们熟知 Restful API 规范标准,从 HTTP 手里拿到 ‘咖啡’ 分类数据后(HTTP Request),并把 ‘咖啡’ 数据精准无误送给 Controllers 部门对应的那个分类加工操作去处理,等待处理结束后将 ‘咖啡’ 处理结果通过 HTTP 原路交还给前端(HTTP Response)。

我们墙裂推荐使用 gin 这个第三方 Web Server API 并献上 gin 的地址。

我们用 gin 定义了4个路由,分别对应之前定义的4个 Restful API,并交由 Controllers 部门里4个方法进行 ’咖啡‘ 分类操作处理:

// Handle Restful API: /api
app := router.Group("/api")
{app.GET("/category/list", controllers.GetCategoryList)app.POST("/category/add", controllers.CategoryAdd)app.PUT("/category/edit", controllers.CategoryEdit)app.DELETE("/category/remove", controllers.CategoryRemove)
}

2. Model 部门

这个部门比较闲,但很严谨,他们定义了一个分类的规范,在后端长什么样子,在前端长什么样子(json),在数据库又长什么样子(bson)。

type Category struct {ID       bson.ObjectId `bson:"_id" json:"id"`Title    string        `bson:"title" json:"title"`IsActive int8          `bson:"is_active" json:"is_active"`
}

3. Controller 部门

这个部门是核心业务处理部门,所有数据都要在这个部门进行加工处理后才能出厂,我们定义了4个方法来分别处理 ’咖啡‘ 分类的增删改查4个操作。

func CategoryAdd() {} // 增
func CategoryRemove() {} // 删
func CategoryEdit() {} // 改
func GetCategoryList() {} // 查

4. DB 部门

这个部门是干脏活累活的部门,但又很重要的部门。他们听从 Controllers 部门的指挥,负责把 ’咖啡‘ 分类数据在 Controllers 部门和数据库之间进行运输。

我们使用的数据库是 MongoDB,所以我们墙裂推荐使用 mgo,mgo 是一个帮助GO语言操作MongoDB的第三方API,同样献上 mgo 地址。

然后 Controllers 就只需要3行代码,就可以轻松操作 MongoDB:

session, db := db.Get()
collection := db.C("category")collection.Insert(&model) // 增
collection.Update(&model) // 删,改
collection.Find().One(&model) // 查

5. Libs 部门

这个部门是支持部门,我们会把一些常用的公共操作和方法一起放在这里,提供给所有其他部门使用。

着重提一下 Libs 下的日志部门,在开发和运维的过程中,排查问题和数据统计的重要来源是系统日志,所以日志部门事无巨细的记录着所有工厂里大大小小的事情,虽然做的事情并不起眼,但离开了他们,一旦系统出任何问题的时候就会变得毫无头绪,所以当系统发生问题的时候,日志的作用堪称全厂MVP。

我们使用了一款很优雅的第三方日志库 Golang logging,来看看它的颜值有多高吧。

Log.Debugf("debug %s", "hello") // 常用于开发调试信息输出
Log.Info("info") // 最普通的信息输出
Log.Notice("notice") // 比 Info 更重要一点的信息输出
Log.Warning("warning") // 系统有警告,但仍然可以正常运行
Log.Error("err") // 系统发生错误,有可能无法正常运行
Log.Critical("crit") // 系统崩溃,无法正常运行

PART 4: 增删改查的数据归宿 - MongoDB

我们先讲解一下传统 SQL (例如 MySQL)是怎么做增删改查操作的:

INSERT INTO category VALUES ('5a4e5edb51ed8c6880ca11b7', '咖啡', 1); # 增
UPDATE category SET is_active = 0 WHERE id = '5a4e5edb51ed8c6880ca11b7'; # 删
UPDATE category SET title = 'Coffee' WHERE id = '5a4e5edb51ed8c6880ca11b7'; # 改
SELECT * FROM category WHERE is_active = 1; # 查

Tips:通常商业项目不会真正物理删除一条已存在的数据,所以我们加一个 is_active 字段表示逻辑删除,1-代表可使用,0-代表已删除

很久很久以前,我们的后端 DB 部门会使用一个封装好的 SQLHelper API 来操作数据库:

SQLHelper.Connect("Server=localhost;Port=3306;Database=category;")
SQLHelper.Open()
string sql = "UPDATE category SET is_active = 0 WHERE id = '5a4e5edb51ed8c6880ca11b7'"
int result = SQLHelper.Execute(sql)
SQLHelper.Close()

虽然已经很方便了,但是我们总是嫌弃数据库操作不够聪明,每次都需要编写 SQL,于是有了一种更 Popular 的做法称之为 ORM,这里省略了很多 ORM 原理和实现细节,最终代码只需要这么写:

Category model = Factory.Create("Category")
model.ID = "5a4e5edb51ed8c6880ca11b7"
model.Remove()

至于复杂的 ORM 是怎么把数据库的字段变成 Model 对象的,都一并交给 Factory.Create() 这个部门去实现,本篇文章不做详细讲解。

我们再回过来讲一下 NoSQL 的 MongoDB 是怎么做增删改查操作的:

db.category.insert({"_id" : ObjectId("5a4e5edb51ed8c6880ca11b7"), "title": "咖啡", "is_active": 1}) # 增
db.category.update({"_id" : ObjectId("5a4e5edb51ed8c6880ca11b7")}, {$set:{"is_active": 0}}) # 删 改
db.category.find() # 查

我们的后端 DB 部门没有做什么 ORM 处理操作,事实上 NoSQL 也不需要 ORM,我们使用后端 DB 部门使用的 mgo 作用类似上面提到的 SQLHelper,帮助后端方便的进行 MongoDB 增删改查数据操作。

PART Final: 全栈测试

最后的环节,让我们测试一下我们敲完的代码,测试之前先确认几点:

  1. Web Server 默认端口 8080 没有被占用。占用了可换其他端口。
  2. MongoDB 正常启动运行,默认端口 27017。
  3. 使用的第三方库都正常获取到了本地,获取方式很简单,命令行输入:
go get github.com/gin-gonic/gin
go get gopkg.in/mgo.v2
go get github.com/op/go-logging

一切准备就绪,命令行输入:

go run main.go

此处应有掌声~

现在我们离全栈工程师就只差一个前端的距离了,只需下一篇5分钟学习,就能解锁全栈工程师。

最后献上本文代码,学会使用 Github 也是全栈工程师必修技能。


如需合作或转载请联系本文作者,跪谢

sql增删改查_5分钟GET全栈开发 - 增删改查的取经之路相关推荐

  1. python全栈开发实践入门_讲书3分钟丨《Python全栈开发实践入门》 -讲书人 谢瑛俊...

    只需3分钟就能快速了解一本书! 由作(译)者发声讲书,直指新书的特点与主旨. 只需利用碎片化时间,省时省力选到适合自己的好书 音频链接 音频内容 大家好,我是<Python全栈开发实践入门> ...

  2. ❤️十分钟快速学会使用Nodejs全栈开发微信公众号【建议收藏】

    一.准备 注册微信订阅号 注册小程序测试号 sunny-ngrok工具安装及注册账号 注意:sunny-ngrok的原型是ngrok,不过ngrok是国外的,sunny-ngrok是国内的一个私服,速 ...

  3. 《Spring Boot+Vue全栈开发实战》读书笔记

    写在前面 嗯,回家处理一些事,所以离职了,之前的公司用开源技术封装了一套自己的低代码平台,所以之前学的spring Boot之类的东西都忘了很多,蹭回家的闲暇时间复习下. 笔记整体以 Spring B ...

  4. Oracle APEX 系列文章1:Oracle APEX, 让你秒变全栈开发的黑科技

    本文是钢哥的Oracle APEX系列文章中的第一篇,完整 Oracle APEX 系列文章如下:  - Oracle APEX 系列文章1:Oracle APEX, 让你秒变全栈开发的黑科技  - ...

  5. python全栈开发工程师_【2018重磅巨献】老男孩Python高级全栈开发工程师第三期...

    2018年老男孩python全栈第三期老男孩python全栈3期 老男孩教育Python全栈开发为国内首家专注python全方面开发的教育机构 老男孩Python全栈第三期课程详细目录,高清不加密! ...

  6. Vue3 Typescript + Axios 全栈开发教程:手把手教你写「待办清单」APP

    本文完整版:<Vue3 Typescript + Axios 全栈开发教程:手把手教你写「待办清单」APP> Vue3 Typescript + Axios 全栈开发教程 前端 Vue3 ...

  7. 【笔记-node】《Egg.js框架入门与实战》、《用 React+React Hook+Egg 造轮子 全栈开发旅游电商应用》

    20210226-20210227:<Egg.js框架入门与实战> 课程地址:https://www.imooc.com/learn/1185 第一章 课程导学 01-01 课程介绍 一. ...

  8. node.js之全栈开发

    node.js之全栈开发 1.为什么要学习Node.js Node.js是什么 Node能做什么 一些资源 学习到什么 2.Node 2.1起步 安装Node环境 解析执行JavaScript 2.2 ...

  9. Django银角大王武沛齐配套视频笔记,python全栈开发、pythonWeb

    Django 本套博客基于银角大王武沛齐的django全栈开发视频编写:传送门 如有错误或改进欢迎大家评论.私信交流指正 一.初识Django 1.Djang的安装 在windos命令窗口 win+r ...

  10. 美团酒店Node全栈开发实践

    前后端分离的背景 "前后端分离"显然已不是什么新鲜的话题,Zakas在2013年10月份就曾发表过一篇博客<Node.js and the new web front-end ...

最新文章

  1. Centos升级python
  2. leetcode算法题--复制带随机指针的链表★
  3. JavaCC首页、文档和下载 - 语法分析生成器 - 开源中国社区
  4. oracle 一次删除多张表
  5. Spring Data MongoDB中的审核实体
  6. HUAWEI USG6000系列 NGFW Module V100R001 典型配置案例
  7. java xml开发_JavaWeb开发(XML简介)---3
  8. br php 配置,无法载入 mcrypt 扩展,br /请检查 PHP 配置终极解决方案
  9. 软件包管理器前端工具yum的使用
  10. Windows 8.1 with Update MSDN 简体/英文/繁体
  11. 面向对象16:代码块、final关键字
  12. 74hc138译码器制作火灾报警器
  13. en60204标准_《EN_60204_机械产品电气安全标准介绍》.pdf
  14. Autodesk Eagle入门之-线宽操作
  15. html让图片变灰色,firefox浏览器中css如何把图片变成灰色?
  16. 2020 年博客总结
  17. 基于Python构建机器学习Web应用
  18. android7.0后台,安卓7.0带来一键清理后台 真能使手机变快吗
  19. python3.7 win10 64位系统下用pyinstaller打包的程序在32位系统下无法运行
  20. NB-IoT和eMTC对比

热门文章

  1. MVC控制器取参数值
  2. 一个对iBatis的总结写的不错(转载)
  3. ThreadStatic特性简介
  4. LaTeX (1)——LaTex环境的下载与安装(Tex live 2020+ Tex studio编辑器、 proTeXt(MiKTeX+TeXstudio编辑器))
  5. Intel Edison学习笔记(一)—— 刷系统
  6. Python-Matplotlib 12 多图figure
  7. 关于在Mac上安装模拟器的坑比~~~~~
  8. Inside the Linux Operating System[1]
  9. AURIX Development Studio 使用指北(不定时更新)
  10. 一张图看懂AI、机器学习和深度学习的区别