前言
我是程序员无思。这是创作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数据库的连接告一段落了。目前目录结构如下:
我是程序员无思,喜欢这个系列的文章就点赞支持一下吧!