百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Gin(十一):使用ORM框架,还在手写SQL语句吗?

ccwgpt 2024-09-18 12:19 26 浏览 0 评论

随着项目的不断扩大,总有一天,项目中的表和表中的字段多的数不胜数,如果此时仍旧使用 SQL 语言来执行增删改查,务必会带来很多繁琐的事情,比如说我们要添加一个字段有十多个的结构体,要把结构体中的每个属性都要写一遍。极大的降低了开发速度,也会引入一些错误,所以我们要引入一些框架来对数据库进行管理,方便我们完成项目。这里我们介绍一下 gorm

gorm

gorm 是 Go 语言中比较知名的 orm 框架之一,在 Github 上的有 14.6 K stars。gorm 对于常见的功能基本都已实现。

在 gin 中添加 gorm 是非常简单的。

首先打开我们的 initDB 文件夹。

将原来 sql.Open 改为 gorm.Open 同时引入 gorm , 同时对 Db 的定义类型进行更改,*gorm.DB 。

具体代码如下:

 package initDB
 ?
 import (
 _ "github.com/go-sql-driver/mysql"
 "github.com/jinzhu/gorm"
 _ "github.com/jinzhu/gorm/dialects/mysql"
 "log"
 )
 ?
 var Db *gorm.DB
 ?
 func init() {
 var err error
 Db, err = gorm.Open("mysql", "root:1234@tcp(127.0.0.1:3306)/ginhello")
 if err != nil {
 log.Panicln("err:", err.Error())
 }
 }

此时我们的对框架的引入就已经完成了。

因为我们将 Db 的属性进行了修改,此时的 article.go 中出现了错误。

所以我们修改,利用 gorm 的 api 来进行。

实现增删改查

增加

增加方法,之前使用 SQL 语言来实现添加的,如下:

 result, e := initDB.Db.Exec("insert into ` article` (type, content) values (?, ?);", article.Type, article.Content)

现在我们要通过框架来实现这一个过程。

 create := initDB.Db.Create(&article)

是不是很简单了?

查询单个

通过 article.Id 传入限制条件,该方法仅仅是用于 主键为 int 类型时。

 initDB.Db.First(&article, article.Id)
 return article

查询所有

 var articles []Article
 initDB.Db.Find(&articles)
 return articles

删除

 initDB.Db.Delete(article)

通过以上的一些方法可以看出来,基本对之前的增删改查代码有了极大的缩短,大大的减少了错误的发生。

此时就可以运行我们的代码,通过 .http 也好,通过单元测试也好,但是一运行就会报错。报错如下:

 Error 1146: Table 'ginhello.articles' doesn't exist 

说在 ginhello 库中并没有 articles 表。 这句话说的没有毛病啊,我们的确没有 articles 表,我们建立的是 article 表。

原来 gorm 在对应的结构体默认会加个 s,所以我们现在有两个办法,第一个就是改表明,但是表明往往是不可以随便修改的。第二个是修改代码,让它之道我们要找的表为 article 而不是 articles。

 func (article Article) TableName() string {
 return "article"
 }

实现该接口,该接口返回一个字符串,通过字符串来定义我们需要关联的表。

此时再次运行我们的代码,发现功能可以完整的使用,并且没有报错。

自动建表

加入现在是一个新的项目,还没有建立数据库表,或者项目迁移到另一个环境,环境上还没有数据库表,怎么办?

gorm 给我们提供了建立数据库表的功能。

我们新建立一个 model 叫做 comment ,管理评论。

 package model
 ?
 type Comment struct {
 ID int
 content string
 }

这里的 ID 要全部进行大写

建立好结构体后就可以对结构体进行建立对应的数据库表。

对于建表 我们首要检查一下表是否存在,如果存在就不需要重新建立了,不能每次运行项目就把之前的数据覆盖掉。

 func init() {
 table := initDB.Db.HasTable(Comment{})
 if !table {
 initDB.Db.CreateTable(Comment{})
 }
 }

运行我们的项目就会发现数据库中已经新建立了表,如果我们想在建立的时候同时为 id 建立索引,我们可以对结构体 tag 上标明。如下

 type Comment struct {
 ID int `gorm:"index:idx_id"`
 Content string
 }

将刚刚建立的表删除掉,重新运行代码。数据库表中会添加 idx_id 索引。

?gorm model 的使用

我们在建立数据库的时候,每个表都会建立主键 ID ,如果你读过 阿里巴巴 Java 开发规范 的话,还应该知道一些其他的必要信息,比如说创建时间,修改时间等。

此时 gorm model 就起到了作用,他已经给我们封装了一下属性。

我们需要将结构体改为下面的样子

 type Comment struct {
 gorm.Model
 Content string
 }

删除了之前的表结构,重新运行项目,此时就会生成新的表结构。

?总结

通过本章节的简答学习,基本可以将 gorm 融入到我们的 gin 项目中,并且操作数据库,极大的减少了我们的代码量。如果有时间的话,后期可能会专门出一起 gorm 的使用介绍。

?本章节代码

Github 请点击 了解更多

历史文章

Gin(一):Hello Gin ,学习 Gin 从这里开始

Gin(二):路由Router ,go语言框架学习

Gin(三):与模板配合使用 tmpl,go web 开发最火框架之一

Gin(四):接收表单数据和模型绑定,Go语言最火web框架之一

Gin(五):连接MySQL , Go 轻量级框架 Gin

Gin(六):文件的上传,go语言最火框架之一

Gin(七):中间件的介绍和使用,GO语言最火的框架之一

Gin(八):cookies使用,Go语言web最火框架之一

Gin(九):生成restful 接口,go语言最火web框架之一

相关推荐

5 分钟搭建 Node.js 微服务原型(node 微服务架构)

微服务已成为在Node.js中构建可扩展且强大的云应用的主流方法。同时也存在一些门槛,其中一些难点需要你在以下方面做出决策:组织项目结构。将自定义服务连接到第三方服务(数据库,消息代理等)处理微服...

当前的前端,真的不配叫程序员吗?

今天看到一个比较令人震惊的帖子,说前端不配叫程序员,令我很吃鲸,是谁我就不说了,帖子出处是一个大龄程序员组里面的,想想也不觉得奇怪了,毕竟对于年龄比较大的程序员来说,前端起步比较晚,最开始就是一个切图...

聊聊asp.net中Web Api的使用(asp.net core web api教程)

扯淡随着app应用的崛起,后端服务开发的也越来越多,除了很多优秀的nodejs框架之外,微软当然也会在这个方面提供更便捷的开发方式。这是微软一贯的作风,如果从开发的便捷性来说的话微软是当之无愧的老大哥...

NodeJS中,listen Access:permission denied解决办法

错误描述:Win10系统,NodeJS程序。使用express框架开发的http服务器,启动时出现错误提示“listenAccess:permissiondenied"。错误原因:这是由于...

Hono — 下一代高性能web框架(天融信下一代vnp)

最近公司可能要有变革,要统计我们的技能。真的是很无语,但是有没有办法。哎,问豆包吧提起Hono大家可能很陌生,这是什么?但是我提到Expressjs、nodejs想必前端小伙伴很熟悉啊。那么Hon...

生活例子说明线程,简单明了(列举一个日常生活中的例子以程序的形式表示)

1.程序设计的目标在我看来单从程序的角度来看,一个好的程序的目标应该是性能与用户体验的平衡。当然一个程序是否能够满足用户的需求暂且不谈,这是业务层面的问题,我们仅仅讨论程序本身。围绕两点来展开,性能...

Node实战006:自定义模块的创建和使用详解

Node的应用是由模块组成的,每个文件的定义都是一个模块(module变量代表当前模块)并有自己的作用域。Node遵循commonjs的模块规范,用来隔离每个模块的作用域,使每一个模块在自身的命名空间...

Node.js基本内容和知识点(node.js的概念)

简单的说Node.js就是运行在服务端的JavaScript,起初段定位是后端开发语言,由于技术的不够成熟,一般小型项目会完全使用node.js作为后台支撑,大项目中,运行不够稳定,不会轻易使用...

干货 | 如何利用Node.js 构建分布式集群

引言在软件定义的世界里,企业通过Web应用和移动应用程序来提供大部分的服务,Node.js迅速成为时下最为流行的一个平台之一,就和它可以搭建响应速度快、易于扩展的web应用和移动应用有很大关系,并凭...

nodejs mongodb 实现简易留言板(node.js留言板)

一个朋友问了一下mongodb的一些操作问题我就做了下面这个简单的留言板给他做一个实例希望能帮助到他express的框架就不说了express的问题请移步nodejs之expressht...

nodejs mqtt 智能售货机系统物联网控制系统源码分享

智能售货机系统(Moleintelligentvendingmachinesystem)是一套物联网控制系统性的解决方案。主要涉及到的语言和库有c,c++,js,nodejs,vue.js,...

为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温不火?

说nodejs只是靠营销的是否太天真了些?当初nodejs出来的时候各种BUG,我简单的测试其大文件传输都会出现各种问题。而同時期的其他阵营早就甩其几条街了。但是为什么却能一直不断发展壮大?...

2020年14个最有用的NodeJS库(node用什么数据库)

Express快速,简单,极简的节点Web框架对…有好处·易于处理多种类型的请求,例如GET,PUT,POST和DELETE请求·快速构建单页,多页和混合Web应用程序每周下载1100万Lice...

连载:2016年最好的JS框架和库(下)

继续上一期的介绍:Agility.jsAgility.js是专为JS服务的MVC库,你可以免费编写可再用和可维护的浏览器代码,Agility支持Js,样式(CSS)、内容(HTML)和行为(JS)。C...

awesome-nodejs 终极资源库:60K+星标的开发者宝藏

Node.js终极资源库:60K+星标的开发者宝藏引言在GitHub上,有一个备受瞩目的Node.js资源仓库,以其惊人的60.6k星标量和6kfork量,成为了Node.js开发者的必备参考。这个...

取消回复欢迎 发表评论: