• golang初始化数据库(MySQL)


    Golang初始化MySQL数据

    安装依赖

    主要这边还需要安装两个依赖,gormviper ,具体的可以访问他们的官网(Gorm官网地址 Viper Github地址)

    初始化配置
    在根目录下打开终端执行:

    go mod init 项目名称 (例如: go mod init demo )

    安装依赖

    go get github.com/jinzhu/gorm 或 go get -u gorm.io/gorm
    go get -u gorm.io/driver/mysql

    go get github.com/spf13/viper

    创建文件

    创建一个yml文件(application.yml)

    #server:
    #  post: 8888
    datasource:
      driverName: mysql
      host: # 端口地址
      port: # 端口号
      database: # 数据库名称
      username: # 账号
      password: # 密码
      charset: utf8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在目录下创建一个common包,包下再创建一个database.go文件,内部写一个初始化数据库,建议拆分出来,这样拼接的方式有利于项目在不同环境下进行快速的更改配置。

    package common
    
    import (
    	"fmt"
    	// 看清楚引入包,包的差异存在方法差异
    	"github.com/jinzhu/gorm" 
    	"github.com/spf13/viper"
    )
    
    // 用大写声明(可以全局访问)
    var DB *gorm.DB
    
    // 创建数据库连接池
    func InitDB() *gorm.DB {
    	driverName := viper.GetString("datasource.driverName")
    	host := viper.GetString("datasource.host")
    	port := viper.GetString("datasource.port")
    	database := viper.GetString("datasource.database")
    	username := viper.GetString("datasource.username")
    	password := viper.GetString("datasource.password")
    	charset := viper.GetString("datasource.charset")
    	args := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true",
    		username,
    		password,
    		host,
    		port,
    		database,
    		charset)
    
    	db, err := gorm.Open(driverName, args)
    	if err != nil {
    		fmt.Println("fail err mysql", err.Error())
    	}
    
    	// gorm 自动创建表,需要放入model层中的模型,比如 User{}
    	db.AutoMigrate(User{})
    
    	// 进行赋值 否则会空指针
    	DB = db
    	return db
    }
    
    // 获取DB的示例
    func GetDB() *gorm.DB {
    	return DB
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    main函数执行

    在根目录下创建一个main文件(唯一),在这个环境我们需要做做一个初始化配置文件的操作,在main中优先加载这个config,然后才是初始化数据库,顺序不能错哈,因为数据库的连接信息在yml文件中,所以不要将顺序搞错。

    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	_ "github.com/go-sql-driver/mysql"
    	"github.com/spf13/viper"
    	"go-gin-vue/common"
    	"os"
    )
    
    func main() {
    	InitConfig()
    	// 尝试连接数据库
    	db := common.InitDB()
    	// 延迟关闭
    	defer db.Close()
    
    	r := gin.Default()
    	// 加载路由
    	r = CollectRouter(r)
    
    	// 监听的端口
    	// 可以在yml中定义server端口并且使用yml文件中定义的端口
    	// port := viper.GetString("server.port") 
    	if port != "" {
    		panic(r.Run(":" + port))
    	}
    	r.Run(":9000") // 测试端口 9000 上启动服务
    }
    
    // 初始化config文件
    func InitConfig() {
    	workDir, _ := os.Getwd()
    	// 读取的文件名
    	viper.SetConfigName("application")
    	// 读取的文件类型
    	viper.SetConfigType("yml")
    	// 读取的路径
    	viper.AddConfigPath(workDir + "/config")
    
    	err := viper.ReadInConfig()
    	if err != nil {
    		panic("")
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
  • 相关阅读:
    一个超经典 WinForm 卡死问题的再反思
    cf #818 Div.2(A~C)
    面试必备:一线大厂Redis缓存设计规范与性能优化
    淘宝等电商平台API接口评论,item_review-获得商品评论
    deque容器(20221115)
    C语言程序环境和预处理
    字符串 - string(Lua)
    JavaScript设计模式:享元模式
    CVE-2023-34040 Kafka 反序列化RCE
    jwt 保证前端刷新不掉线
  • 原文地址:https://blog.csdn.net/weixin_47024018/article/details/127445628