gin引入viper、gorm(教程part2)
2021/9/29 23:12:03
本文主要是介绍gin引入viper、gorm(教程part2),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
我是程序员无思。这是创作gin + vue 零基础入门的教程(part2),这个教程的前后端源码我将同步更新至我的gitee账号:https://gitee.com/coderwusi 、github账号:https://github.com/coderwusi。
新建项目根目录文件夹gin-base-cli ,在根目录文件夹下新建 main.go,内容如下:
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // 监听并在 0.0.0.0:8080 上启动服务 }
使用go的包管理工具go modules ,在cmd下输入以下内容初始化:
go mod init gin-base-cli
输入 以下内容更新依赖
go mod tidy
插曲:go modules 与 go path
gopath的设置通过设置变量名为GOPATH,变量值为文件夹目录
使用 go mod tidy 命令进行依赖整理时,新增加的包会出现在gopath的路径下
注意事项
- 使用 go mod 相关命令只会整理你的项目依赖,但你下载的包并不会丢失。
- 一台机器上所有项目的依赖都会在gopath目录下,gopath目录的占用空间随着时间可能越来越多,所以最好不要放系统盘里。
回到正题
在项目根目录下执行
go run main.go
程序编译完后访问
http://localhost:8080/ping
显示如下,则表示gin引入成功
引入viper
在根目录新建config.yaml文件
mysql: host: "127.0.0.1" port: 3306 suffix: "charset=utf8mb4&parseTime=True&loc=Local" #后缀 dbname: "wusidb" username: "root" password: "123456" max_open_conns: 200 max_idle_conns: 50
新建名为setting的文件夹,在setting文件夹下新建init.go:
package setting import ( "fmt" "github.com/spf13/viper" //第三方配置管理神器 ) var Conf = new(TotalConfig) type TotalConfig struct { *MySQLConfig `mapstructure:"mysql"` } type MySQLConfig struct { Host string `mapstructure:"host"` Username string `mapstructure:"username"` Password string `mapstructure:"password"` Dbname string `mapstructure:"dbname"` Suffix string `mapstructure:"suffix"` Port int `mapstructure:"port"` MaxOpenConns int `mapstructure:"max_open_conns"` MaxIdleConns int `mapstructure:"max_idle_conns"` } func init() () { viper.SetConfigFile("config.yaml") //viper.AddConfigPath("./") if err := viper.ReadInConfig(); err != nil { fmt.Printf("viper.ReadInConfig failed, err:%v\n", err) return } if err := viper.Unmarshal(Conf); err != nil { fmt.Printf("viper.Unmarshal failed, err:%v\n", err) } fmt.Println(Conf.MySQLConfig) }
在main.go 中导入setting :
package main import ( _ "gin-base-cli/setting" //导入setting.init 完成初始化 "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // 监听并在 0.0.0.0:8080 上启动服务 }
执行命令整理依赖
go mod tidy
执行 go run main.go启动程序
如上图所示,若打印出config.yaml中的文件,则表示第三方配置库viper引入成功。
当前目录结构如下:
在这里插入图片描述
引入Gorm
Gorm 是非常好的orm框架,可以大大加快我们编写sql语句的效率
根目录下新建model文件夹,在model文件夹下新建init.go:
package model import ( "fmt" "gin-base-cli/setting" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/schema" ) // DB 数据库链接单例 var DB *gorm.DB func MysqlInit(config *setting.MySQLConfig) () { var err error dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s", config.Username, config.Password, config.Host, config.Port, config.Dbname, config.Suffix) DB, err = gorm.Open(mysql.New(mysql.Config{ DSN: dsn, // DSN data source name DefaultStringSize: 256, // string 类型字段的默认长度 DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持 DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引 DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列 SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置 }), &gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true}}) if err != nil { fmt.Println("数据库连接错误:", err) return } if err := DB.AutoMigrate(); err != nil { fmt.Println("数据库迁移错误:", err) return } fmt.Println("success") }
修改main.go:
package main import ( "gin-base-cli/model" "gin-base-cli/setting" "github.com/gin-gonic/gin" ) func main() { setting.Init() model.MysqlInit(setting.Conf.MySQLConfig) r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // 监听并在 0.0.0.0:8080 上启动服务 }
go run main.go 命令启动程序,若打印出如下信息则表示gorm引入成功:
阶段总结
至此,环境变量的读取,mysql数据库的连接告一段落了。目前目录结构如下:
我是程序员无思,喜欢这个系列的文章就点赞支持一下吧!
这篇关于gin引入viper、gorm(教程part2)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23MongoDB身份认证机制揭秘!
- 2024-11-20MongoDB教程:从入门到实践详解
- 2024-11-17执行 Google Ads API 查询后返回的是空数组什么原因?-icode9专业技术文章分享
- 2024-11-17google广告数据不同经理账户下的凭证可以获取对方的api数据吗?-icode9专业技术文章分享
- 2024-11-15SendGrid 的 Go 客户端库怎么实现同时向多个邮箱发送邮件?-icode9专业技术文章分享
- 2024-11-15SendGrid 的 Go 客户端库怎么设置header 和 标签tag 呢?-icode9专业技术文章分享
- 2024-11-12Cargo deny安装指路
- 2024-11-02MongoDB项目实战:从入门到初级应用
- 2024-11-01随时随地一键转录,Google Cloud 新模型 Chirp 2 让语音识别更上一层楼
- 2024-10-25Google Cloud动手实验详解:如何在Cloud Run上开发无服务器应用