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

4f9fb0d232fa9ca5c245540980244778.png

本文攻略:独立全栈开发一个项目,实现 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

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

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") // 系统崩溃,无法正常运行

7cde62b48add20fad34c9c13ffb66a88.png

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

d60e00ef607bbac44e7b845c02dbed95.png

cf099d7bc27ec54ef889852e93f01dac.png

79e3184515854d51ca32ec84d6e5b6cd.png

此处应有掌声~

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

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


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值