Top Go模块:带有GORM的Golang Web api

更新:自2021年5月1日起,GoCenter中央存储库已被淘汰,所有功能将被弃用。有关中心日落的更多信息,请阅读弃用博客文章

每个月GoCenter都会奖励表现最好的模块金花鼠徽章作为成就的标志。我们正在写其中的一些高层模块以及它们在围棋中的用法。

Robert Greiseimer将Go称为云计算语言,虽然Go具有支持微服务架构、分布式系统和大型企业应用程序需求的强大功能已经不是什么秘密,但很少有人谈论的是,Go从一开始就考虑了web开发。事实上,社区中的许多开发人员正在使用Go进行全栈开发,并支持新的模块和框架,使Go成为强大的web语言。

让我们来看看Golang和不断扩大的社区世界所引领的一些方式去模块支持web应用中的数据交换。我还将展示如何通过GoCenter(开发社区的免费Go模块代理)识别一些高质量的模块,并深入研究我最喜欢的一个模块。

Golang热爱网络数据

Go拥有复杂的网络包,这是其核心库的一部分。在最近的Golang 1.15发行版中核心库已更新有改进数据库/ sql,数据库/ sql /司机,net/http,编码/ json增强了Go处理网络数据的能力。这些更改增加了一些限制,可以降低大量数据服务过度使用堆栈内存的风险,并为数据库连接设置空闲时间。

Web服务器创建

去的net/httppackage是标准库的一部分,旨在将HTML从服务器传输到客户端。它使用http。处理程序接口,创建自己的web服务器。这个库使得RESTful API的开发非常容易,并且使用Go结构,大数据应用程序可以映射到许多不同的数据库和数据类型。

启动web服务需要导入net/http包并编写两个函数。

package main import ("fmt" "log" "net/http")ResponseWriter, r *http.Request){fmt. request;Fprintf(w,“欢迎来到主页!”)fmt。Println("Endpoint Hit:首页")}func handleRequests() {http. http. request ()HandleFunc("/",主页)日志。ListenAndServe(":10000", nil))} func main() {handleRequests()}

从这个非常简单的文件中,您已经设置了一个功能强大的web服务器。当然,这个服务器实际上并没有从web向数据库发送、存储和检索信息。为了构建该功能,我们将创建一个基本的CRUD应用程序创建,,更新而且删除API中的信息。

方法创建RESTful api时,可以了解有关使用此包的更多详细信息埃利奥特福布斯的优秀教程

JSON

发送和接收信息的一种方法是使用Go的核心库编码/ json.这个库可以很容易地从JSON读取/写入数据到Go应用程序。JSON或Javascript对象表示法是为了在web上编码和解码数据而构建的,比直接的XML更适合web。使用键:值对,JSON读起来更像纯文本,它的可读数据格式可以在构建全堆栈应用程序时使用,从而避免冗长的SQL。虽然JSON使发送数据变得容易,但它仍然需要一种与PostgreSQL这样的数据库对话的方法。

Golang orm

幸运的是,Go社区已经构建了许多对象关系映射库(orm),允许Go开发人员使用JSON键:值对语法和编码直接映射到像PostgreSQL这样的SQL数据库。orm允许开发人员使用本地编程范型将数据映射到SQL。

ORM将数据库信息转换为Golang对象,反之亦然。当使用ORM时,你可以使用这样的Golang结构更好地映射数据,而不是直接将SQL查询写入应用程序:

//我的数据库类型的用户结构型号firstName string lastName string电子邮件字符串消息字符串职业字符串年龄int zipCode int}

并不是每个人都喜欢使用orm,因为它们从存储在数据库中的实际数据创建了一个抽象级别。取决于您使用的库,另一个缺点是,尽管SQL仍然存在,但orm框架可能在一夜之间出现和消失。但总的来说,我发现orm可以更容易地在Go中跟踪web应用程序数据,并通过将应用程序中的一堆SQL命令切换为更容易使用的东西来减少冗长的编码。

社区中正在支持和推广许多Go orm,所有这些都可以在GoCenter中获得:

  • XORM一个简单而强大的ORM框架
  • Go-PG一个postgreSQL客户端和Golang的ORM
  • SQLBOILDER一种工具,用于生成适合数据库模式的Go ORM
  • SQLX:不是ORM,而是Go中SQL的另一个伟大工具

戈姆:顶级地鼠

弄脏是开发人员友好的ORM创建的Jinzhu张在GitHub上有超过19,000个明星,拥有强大的社区支持和易于遵循文档.GORM提供CRUD操作,还可以用于数据库模式的初始迁移和创建。还有一些GORM做得很好的事情,包括它的本地插件支持的可扩展性,它对测试的依赖,以及一对一和一对多的关联组。Gorm也支持sqlite,mysql,postgres,和该软件。

这些功能是GORM模块在GoCenter中被誉为“顶级地鼠”的重要原因。当你查看GoCenter关于GORM模块的丰富元数据时,你可以看到为什么:

  • 模块的自述引导您到全面的文档。方法可以了解有关模块代码的更多详细信息GoDoc选项卡,其中显示了自动生成的函数等文档。
  • GoCenter的所使用的而且指标选项卡这表明这个模块是受欢迎和广泛信任的,有许多下载、分叉、贡献者和其他Go模块的使用。
  • GoCenter的安全选项卡还揭示了此模块的当前版本及其依赖项没有已知的NVD漏洞JFrog x光深度扫描

使用弄脏

假设你想要构建一个API(或后来的web应用程序),要求用户向你提供他们的姓名、电子邮件地址和一条短消息。使用GORM,将其映射到数据库的步骤非常简单。的步骤:

  • 设置数据库
  • 映射User结构
  • 连接到db
  • 初始迁移到db
  • 设置函数
  • 运行应用程序

GORM预排

假设我的兼职房地产经纪人(或者我的妹妹)需要一个web应用程序来收集和存储关于她在我们家乡附近管理的房产的查询。我需要做的第一件事是开发一个可以存储用户信息的数据库和一个web API,它可以通过联系表单收集信息,然后访问用户信息,以便在浏览器中读取。我们将详细介绍开发这类应用程序所采取的几个主要步骤。

导入我的模块

首先在我们的main.go文件中,我们可以使用以下命令导入模块:

$ export GOPROXY=https://gocenter。IO $ go get github.com/jinzhu/gorm $ go get github.com/mattn/go-sqlite3

DB连接变量

为GORM数据库创建一个简单的变量:

var db *gorm.DB

用户结构

我们将使用映射用户姓名、电子邮件和消息的Golang结构体创建模型定义。

//我的数据库类型的用户结构{gorm。模型名称字符串电子邮件字符串消息字符串

DB的初始迁移

我已经命名了我的sqlite数据库project.db并且可以使用GORM的AutoMigrate功能,函数看起来像这样:

//初始化迁移项目与db。自动igrate func InitialMigration() {db, err = gorm。打开("sqlite3", "project.db") if err != nil {fmt.Println(err. error ()) panic("Failed to connect to database")} defer db.Close() db.AutoMigrate(&User{})}

视图处理函数

这将允许我们在浏览器中看到API数据:

func viewHandler(写入http。ResponseWriter, request *http.Request){占位符:= []byte("成功连接到数据库…")_,err:= writer.Write(占位符)check(err)}

API的功能

该API使用了四个主要函数,使我们能够在数据库中查找/获取用户、添加新用户、删除用户和更新用户信息。可以概括为:

  • 函数的权限
  • 函数分类列出
  • func deleteUser
  • func updateUser

例如,这个函数将连接到数据库,并为用户显示所有条目:

func allUsers(w http。ResponseWriter, r *http.Request) {db, err:= gorm。打开("sqlite3", "project.db") if err != nil {panic("failed to connect database")} defer db.Close() var users []User db.Find(&users) fmt. db.Find(&users)Println("{}", users) json.NewEncoder(w).Encode(users)}

路由器

在创建上面的每个函数之后,处理路由的函数看起来像这样:

func handleRequests() {myRouter:= mux.NewRouter(). strictslash (true) myRouter. func handleRequests() {myRouter:= mux.NewRouter(). strictslash (true)HandleFunc("/users", allUsers). methods ("GET")HandleFunc("/user/{name}", deleteUser). methods ("DELETE")HandleFunc("/user/{name}/{email}", updateUser). methods ("PUT")HandleFunc("/user/{name}/{email}", newUser). methods ("POST")HandleFunc("/user/{name}/{email}/{message}", updateUser). methods ("PUT")HandleFunc("/user/{name}/{email}/{message}", newUser). methods ("POST") log.Fatal(http。ListenAndServe(":8081", myRouter))}

主要功能

最后,你可以通过在你的主函数中放置以下内容来运行应用程序:

Func main() {fmt. {fmt.}Println("GORM API项目已启动")initialMigration() handleRequests()}

运行应用程序

然后使用快跑,曼恩,快跑,我们来看看他们的反应:

GORM API项目启动

当我POST一些请求到我的API,我可以得到这个请求,并在浏览器中看到数据:

的深入了解

作为第一次使用GORM的Go开发人员,它使得迁移数据和将数据映射到sqlite数据库非常容易。上面的代码只是让您开始的一个快照。

欲知更多有关使用GORM构建api,可以了这个优秀的完整教程视频由埃利奥特福布斯别忘了在Twitter上感谢Elliot他的精彩教程涵盖了Golang api的各个方面。

GORM v2现在也发布了,并正在用于公共测试。

结论

Go在web API开发中的优势包括它的速度和可扩展性;在机器学习成为主流的时代,这一点非常重要。Go是在多核处理器和多核应用时代构建的了goroutine通过多个cpu上的多个通道同时线程任务。这意味着它可以处理大型数据应用程序所需的规模和基础设施,并可以同时处理数百万个HTTP请求。它也是静态类型的,其严格的语法使它更容易调试和防范带有大型库的不太严格的语言(如Javascript)可能引入的错误。这就是为什么从优步(Uber)到DropBox等公司都将Go作为api语言的选择,并扩展其支持web的应用程序。

如果你想使用Go的API功能,使用GORM这样的orm来构建你自己的web API是一个很好的开始。