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

更新:从2021年5月1日起,GoCenter中央存储库已经过期,所有功能将被弃用。有关中心日落的更多信息请阅读弃用博文
每个月GoCenter都会奖励表现最好的模块金花鼠徽章作为成就的标志。我们正在写其中的一些高层模块以及它们在围棋中的用法。
Robert Greiseimer称Go为云计算的语言,众所周知,Go具有支持微服务架构、分布式系统和大型企业应用的强大功能,但很少有人提及的是,Go从一开始就考虑到了web开发。事实上,社区中的许多开发人员正在使用Go进行全栈开发,并支持新的模块和框架,使Go成为一种强大的网络语言。
让我们来看看Golang和不断扩大的社区世界所主导的一些方式去模块支持web应用中的数据交换。我还将展示如何通过GoCenter(开发社区的免费Go模块代理)识别一些高质量的模块,并深入研究我最喜欢的一个模块。
Golang喜欢网络数据
围棋有复杂的网络包,这是它的核心库的一部分。最近发布的Golang 1.15核心库已更新改进了数据库/ sql,数据库/ sql /司机,net/http,编码/ json增强了围棋处理网络数据的能力。这些更改增加了限制,降低了大量数据服务过度使用堆栈内存的风险,并为数据库连接设置了空闲时间。
创建Web服务器
去的net/httppackage是标准库的一部分,旨在将HTML从服务器传输到客户端。它使用http。处理程序创建自己的web服务器的接口。这个库使得RESTful API开发非常容易,通过Go结构,大数据应用程序可以映射到许多不同的数据库和数据类型。
启动web服务涉及到导入net/http包和编写两个函数。
包主导入("fmt" "log" "net/http")响应器,r *http.Request){fmt。Fprintf(w,“欢迎来到主页!”)Println("Endpoint Hit:首页")}func handleRequests() {http. htmlHandleFunc("/",主页)ListenAndServe(":10000", nil))} func main() {handleRequests()}
从这个非常简单的文件中,您已经设置了一个功能正常的web服务器。当然,这个服务器实际上并没有从网络向数据库发送、存储和检索信息。为了构建该功能,我们将创建一个基本的CRUD应用程序创建,读,更新而且删除信息。
您可以了解使用此包从类创建RESTful api的更多细节艾略特·福布斯的优秀教程.
JSON
发送和接收信息的一种方法是使用Go的核心库编码/ json.这个库使得从JSON向Go应用程序读写数据变得很容易。JSON或Javascript对象表示法的建立是为了跨web编码和解码数据,比直接的XML更适合web。使用键:值对,JSON读起来更像纯文本,它的可读数据格式可以在构建全堆栈应用程序时使用,避免使用冗长的SQL。虽然JSON使数据发送变得简单,但它仍然需要一种与PostgreSQL这样的数据库通信的方法。
Golang orm
幸运的是,Go社区已经建立了许多对象关系映射库(orm),允许Go开发人员使用JSON键:值对语法和编码直接映射到SQL数据库,如PostgreSQL。orm使开发人员能够使用他们的原生编程范式将数据映射到SQL。
ORM将数据库信息转换为Golang对象,反之亦然。当使用ORM时,与直接将SQL查询写入应用程序相比,使用Golang结构可以更好地映射数据:
//我的数据库类型的用户结构型号firstName string lastName string email string message string profession string age int zipCode int}
不是每个人都喜欢使用orm,因为它们从存储在数据库中的实际数据中创建了一个抽象级别。取决于您使用的库,另一个缺点是,虽然SQL已经存在,但ORMs框架可能在一夜之间出现或消失。但总的来说,我发现orm使得在Go中跟踪web应用程序数据变得更加容易,并且通过将应用程序中的一堆SQL命令切换为更容易使用的东西,减少了冗长的编码。
有很多Go orm正在社区中得到支持和推广,所有这些都可以在GoCenter中获得::
- XORM:一个简单而强大的围棋ORM框架
- Go-PG:Golang的postgreSQL客户端和ORM
- SQLBOILDER:根据数据库模式生成Go ORM的工具
- SQLX:不是ORM,而是另一个很棒的Go SQL工具
戈姆:顶级地鼠
弄脏是开发人员友好的ORMJinzhu张在GitHub上有超过19000个星星,拥有强大的社区支持和易于理解的文档.GORM提供CRUD操作,还可以用于数据库模式的初始迁移和创建。GORM做得很好的其他一些事情包括它的可扩展性与本地插件支持,它对测试的依赖,以及一对一和一对多的关联组。Gorm还支持sqlite,mysql,postgres,和该软件。
- 模块的自述引导您到全面的文档。可以了解关于模块代码的更多细节GoDoc选项卡,它显示自动生成的函数文档等。
- GoCenter的所使用的而且指标选项卡表明这个模块很受欢迎,并且得到了广泛的信任,有很多的下载、分叉、贡献者和其他围棋模块的使用。

- 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结构创建模型定义。
//我的数据库类型的用户结构模型名称string电子邮件字符串
DB初始迁移
我已经命名了我的sqlite数据库project.db可以使用GORM的AutoMigrate特性,函数如下所示:
// initalmigration for project with db。AutoMigrate 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) {placeholder:= []byte("成功连接到数据库…")_,err:= writer.Write(placeholder) 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[]用户db.Find(&users) fmt. db.Close()Println("{}", users) json. newencode (w).Encode(users)}
路由器
在创建了上面的每个函数之后,处理路由的函数看起来像这样:
func handleRequests() {myRouter:= mux.NewRouter(). strictslash (true) myRouter。HandleFunc("/users", allUsers). methods ("GET")myRouter. 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))}
主要功能
最后,你可以通过在你的main函数中放入以下代码来运行应用程序:
Func main() {fmt. fmt。Println("GORM API项目已启动")initialMigration() handleRequests()}
运行应用程序
然后使用快去,主舰,快去,我们将看到响应:
GORM API项目启动
当我POST了一些请求到我的API,我可以得到这个请求,并在浏览器中看到数据:

的深入了解
作为第一次使用GORM的Go开发人员,它使得数据迁移和映射到sqlite数据库非常容易。上面的代码只是让您开始的一个快照。
如欲了解更多有关使用GORM来构建api,看出来了这个优秀的完整教程的视频由埃利奥特福布斯.别忘了在推特上感谢Elliot观看他精彩的教程,其中涵盖了Golang api的各个方面。
GORM v2现在也发布了,并用于公共测试。
结论
Go在web API开发中的优势包括速度和可扩展性;在机器学习成为主流的时代,这一点非常重要。围棋是在多核处理器和多核应用的时代构建的了goroutine通过多个cpu上的多个通道同时执行任务。这意味着它可以处理大型数据应用程序所需的规模和基础设施,并可以同时处理数百万个HTTP请求。它还是静态类型的,其严格的语法使调试和防止不太严格的语言(如Javascript)可能引入的巨大库的错误变得更容易。这就是为什么从Uber到DropBox等公司都在使用Go作为api的首选语言,并将其用于扩展网络应用程序。
如果你想使用Go的API功能,使用GORM这样的orm构建你自己的web API是一个很好的起点。
