Gin+GORM+Zap+PostgreSQL的Web后端-Gin进阶

上一篇文章介绍了Gin和Gin的简单使用,本次介绍Gin进阶使用,并和一些常用的库组合使用,最后测试运行并写入数据到PostgreSQL数据库。

可配置

在configs目录下,新增了config.yml作为配置文件,使用viper库读取配置文件参数,来设置Gin框架和一些其他参数。

func InitConfig() {viper.AddConfigPath("./configs")viper.SetConfigType("yaml")viper.SetConfigName("config")if err := viper.ReadInConfig(); err != nil {log.Fatalf("fatal error: read config file: %v", err)}if err := viper.Unmarshal(&AppConfig); err != nil {log.Fatalf("set config file error: %v", err)}
}

路由分组

新建router目录存放所有路由相关代码,router.go为主路由文件,example.go为分路由文件,使用Gin的路由Group设置路由组。

func InitRouter() *gin.Engine {router := gin.New()router.Use(gin.Recovery())if gin.Mode() == gin.DebugMode {router.Use(gin.Logger())}miniRLoad(router)adminRLoad(router)return router
}

GORM

全功能ORM,特性:支持事务,批量插入,SQL构建器,自动迁移,灵活的可扩展API,开发者友好。

在configs目录下,新增db.go,作为数据库配置部分,InitDB初始化数据库连接,MigrateDB来迁移模型变更到数据库中,会在启动时自动创建对应的表结构,无需手动在数据库中操作。

func InitDB() *gorm.DB {dsn := "host=" + AppConfig.DB.Host + " user=" + AppConfig.DB.User + " password=" + AppConfig.DB.Password + " dbname=" + AppConfig.DB.Name + " port=" + AppConfig.DB.Port + " sslmode=disable TimeZone=Asia/Shanghai"db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{DisableForeignKeyConstraintWhenMigrating: true,})if err != nil {global.Logger.Errorf("Failed to init db connection,error: %v", err)}return db
}func MigrateDB() {err := global.DB.AutoMigrate(&model.Users{},)if err != nil {global.Logger.Errorf("Failed to migrate db,error: %v", err)os.Exit(0)}
}

Zap日志

在 Go 中实现极快、结构化、分级的日志记录,在官网测试记录中,普遍比其他日志库要快。

在pkg目录下,新建log包,新建logs.go,可以通过zap.NewProduction()来快速初始化Zap日志,但

缺少自定义,像日志格式、日志文件位置和日志切割,这部分代码较长,暂不在这里贴了,后面会提供整个项目代码库地址。

运行测试

上面组件都会在main.go中进行初始化,最后启动Gin框架提供http服务。

使用docker启动PostgreSQL数据库

docker run -d --name example -e POSTGRES_PASSWORD=example -p 5432:5432 postgres

进入项目的server目录下,运行下面命令启动Gin服务

go run main.go

发送一个POST请求到http://127.0.0.1:8080/api/user/add,Body内容如下,正常可在数据库中插入一条数据了。

{"userName" : "test","pw":"aa1234"
}

介绍了Gin进阶使用,结合一些流行库,作为一个示例,完整代码请在GitHub上下载,具体链接为https://github.com/robin-2016/gin_example。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863813.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DL00868-基于深度学习的红外船舶检测识别分类完整实现数据8000+

随着遥感技术的快速发展,包括无人机、卫星等,红外图像在船舶检测识别中的作用日益凸显。相对于可见光图像,红外图像具有在夜晚和恶劣天气条件下高效检测识别船舶的天然优势。近年来,深度学习作为一种强大的图像处理技术,在红外船舶检测识别领域取得了显著进展。完整链接:…

基于深度学习的红外船舶检测识别分类完整实现数据集8000+张

随着遥感技术的快速发展,包括无人机、卫星等,红外图像在船舶检测识别中的作用日益凸显。相对于可见光图像,红外图像具有在夜晚和恶劣天气条件下高效检测识别船舶的天然优势。近年来,深度学习作为一种强大的图像处理技术,在红外船舶检测识别领域取得了显著进展。完整链接:…

第三章 MBR -- loader

第三章 MBR --> loader 本文是对《操作系统真象还原》第三章学习的笔记,欢迎大家一起交流。 a 知识介绍 在上一章的代码部分,我们通过 BIOS 中断进行字符输出,但是离开实模式之后,BIOS 中断就没法用了,因为 BIOS 中断向量表只在实模式下存在,因此我们肯定还会有别的方…

正常运行 打包后提示某些属性或者类找不到

lombok 注解未正确加载,注意 idea属性修改

itextpdf 找出PDF中 文字的坐标

目录添加引用添加工具类调用 找到位置,签名的话见:https://www.cnblogs.com/vipsoft/p/18644127 新项目可以尝试一下 iText 7 , 我这边是老项目所以还是继续使用 iText 5,主打够用 iText 5 没有直接提供获取文本精确位置的功能。它只能提取文本内容,而文本位置通常需要通过…

Jmeter 进行websocket接口测试

什么是websocket协议? Websocket是基于tcp的一种全双通信协议,客户端与服务器之间通过websocket建立连接后,客户端和服务器之间会长时间保持连接状态(即长连接)。客户端可以向服务器发送数据,服务器也可以主动向客户端推送数据。与http协议不同的是http是tcp的单向通信协…

vscode下载vetur和vue-helper插件之后删除键(backspace)失效

最近我在学习前端的过程中,使用vscode下载的vue的插件:vetur和vue-helper这两个 但随后在写代码的时候发现删除键(backspace)不能使用,其他键都能正常使用,也可以用鼠标选中右键剪切/删除 最后发现是上面的插件会占用backspace按键作为插件的功能键 解决方法 点击左上角—…

使用 C# WPF 根据 SEGY 数据绘制二维地震图

一、引言 在地震勘探领域,SEGY(Society of Exploration Geophysicists Y-data)文件格式是常见的地震数据存储格式。对于地震数据的可视化,通常会将 SEGY 文件中的振幅数据通过图像进行展示,以便进行分析。本文将介绍如何使用 C# WPF 应用程序绘制基于 SEGY 数据的二维地震…

为什么浏览器打开的网页默认是英文显示?

最近在学习的时候遇到的问题,打开一些软件的官网默认都是英文(即使这些网站是国内做的)。 其中一个原因是浏览器的默认设置语言是英文 修改浏览器默认语言 以Google Chrome浏览器为例: 右上角三个点—>设置 左边找到“语言” 将中文置顶

LeetCode 762[二进制表示中质数个计算置位]

LeetCode 762[二进制表示中质数个计算置位]题目 链接 LeetCode 762[二进制表示中质数个计算置位] 详情实例提示题解 思路 两个条件: 1、二进制位为1 2、满足条件1的个数为质数首先 for 循环遍历区间for (int i = left; i < right + 1; i++){int iCount = 0;//二进制位为1的…

[Web Fronted] 前端框架: React

序部分开源项目是基于 Web 前端框架 React 构建的,有必要了解一二。避免一脸懵逼,不知道怎么修改相关代码和配置概述: React React 的简介React 起源于 Facebook 的内部项目因为该公司对市场上所有 JavaScript MVC 框架 都不满意,就决定自己写一套,用来架设 Instagram 的网…