Golang初始化MySQL数据库方法浅析
作者:三杯温开水 发布时间:2024-01-16 23:49:20
标签:GoLang,Go,初始化,数据库
安装依赖
主要这边还需要安装两个依赖,gorm
、viper
,具体的可以访问他们的官网(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
在目录下创建一个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
}
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("")
}
}
来源:https://blog.csdn.net/weixin_47024018/article/details/127445628
0
投稿
猜你喜欢
- 迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法。1 算法原理迪杰斯特拉(Dijks
- 如: 0.625 取 1 2.1 取3 3.6 取4 <% if fix(a)>a then b=fix(a) else b=f
- 如下所示:device = torch.device("cuda:0" if torch.cuda.is_availab
- 八月的UCDChina书友会主题是“信息分类和方法”,在会场中的内容是不足以简单的概述的,而这次交流至少对于分类、属性、关键词与Tag的定义
- 收集所有外部链接的网站爬虫程序流程图下例是爬取本站python绘制条形图方法代码详解的实例,大家可以参考下。完整代码:#! /usr/bin
- root账户为MySQL的超级管理员用户,拥有MySQL提供的所有权限。我们登录了root账户可以重置其它创建的所有用户的密码,那么root
- 树和图的数据结构,就很有意思啦。# coding = utf-8class BinaryTree:def __init__(self, ro
- 前言yolo算法作为one-stage领域的佼佼者,采用anchor-based的方法进行目标检测,使用不同尺度的anchor直接回归目标框
- 本节我们来介绍一下新浪微博宫格验证码的识别,此验证码是一种新型交互式验证码,每个宫格之间会有一条指示连线,指示了我们应该的滑动轨迹,我们需要
- 在Python的标准库中,functools库中有很多对方法有操作的封装功能,partial Objects就是其中之一,他可以实现对方法参
- 基于flask的web应用的诞生,供大家参考,具体内容如下Flask是一个非常优秀的web框架,它最大的特点就是保持一个简单而易于扩展的小核
- 新建项目如下图,比如sigma目录是我要上传的项目,在six-sigma目录下新建三个文件,分别是LICENSE也就是开源协议,README
- 本文实例讲述了Python反转序列的方法。分享给大家供大家参考,具体如下:序列是python中最基本的数据结构,序列中每个元素都有一个跟位置
- XML是一个精简的SGML,它将SGML的丰富功能与HTML的易用性结合到Web的应用中。XML保留了SGML的可扩展功能,这使XML从根本
- SQL Server 2005附加数据库文件时出现了Read-Only错误,附加的时候,系统提示mdf文件为只读,可是打开文件属性,这个属性
- 重复性任务总是耗时且无聊,想一想你想要一张一张地裁剪 100 张照片或 Fetch API、纠正拼写和语法等工作,所有这些任务都很耗时,为什
- AD HOC PAGING:就是指用页面的序号和页面的大小请求一个单独的页面。下面是例子。DECLARE @pagesize AS INT,
- 1) 用正式表达式 regexp "[u0391-uFFE5]"2) 用length和char_lengthdrop t
- 在使用Python做开发的时候,时不时会给自己编写了一些小工具辅助自己的工作,但是由于开发依赖环境问题,多数只能在自己电脑上运行,拿到其它电
- 比较简单的一个页面,类似csdn论坛在ns下的左边列表 描述: 1. 数据名:tree.mdb 表名:tree 表结构:id(自编)&nbs